Một cách tiếp cận tốt để giải quyết vấn đề này là trước tiên hãy viết mã cần thiết để có được một kết quả, sau đó kết hợp mã luồng để song song hóa ứng dụng.
Trong một thế giới hoàn hảo, điều này đơn giản có nghĩa là đồng thời bắt đầu 100.000 luồng kết quả đưa ra kết quả của chúng vào một từ điển hoặc danh sách để xử lý sau này, nhưng trong thực tế, bạn bị giới hạn về số lượng yêu cầu HTTP song song bạn có thể đưa ra theo cách này. Tại địa phương, bạn có giới hạn về số lượng ổ cắm bạn có thể mở đồng thời, bao nhiêu luồng thực thi mà trình thông dịch Python của bạn sẽ cho phép. Từ xa, bạn có thể bị giới hạn số lượng kết nối đồng thời nếu tất cả các yêu cầu chống lại một máy chủ hoặc nhiều máy chủ. Những hạn chế này có thể sẽ khiến bạn phải viết tập lệnh theo cách chỉ thăm dò một phần nhỏ các URL bất kỳ lúc nào (100, như một poster khác được đề cập, có thể là kích thước nhóm chủ đề khá, mặc dù bạn có thể thấy rằng bạn có thể triển khai thành công nhiều hơn nữa).
Bạn có thể làm theo mẫu thiết kế này để giải quyết vấn đề trên:
- Bắt đầu một luồng khởi chạy các luồng yêu cầu mới cho đến khi số luồng hiện đang chạy (bạn có thể theo dõi chúng thông qua threading.active_count () hoặc bằng cách đẩy các đối tượng luồng vào cấu trúc dữ liệu) là> = số lượng yêu cầu đồng thời tối đa của bạn (giả sử 100) , sau đó ngủ trong một thời gian ngắn. Chuỗi này sẽ chấm dứt khi không còn URL nào để xử lý. Do đó, chuỗi sẽ tiếp tục thức dậy, khởi chạy các luồng mới và ngủ cho đến khi bạn kết thúc.
- Có các luồng yêu cầu lưu trữ kết quả của chúng trong một số cấu trúc dữ liệu để lấy và xuất sau này. Nếu cấu trúc bạn đang lưu trữ kết quả là một
list
hoặc dict
trong CPython, bạn có thể nối hoặc chèn các mục duy nhất từ các luồng của mình một cách an toàn mà không cần khóa , nhưng nếu bạn ghi vào tệp hoặc yêu cầu tương tác dữ liệu chéo phức tạp hơn, bạn nên sử dụng khóa loại trừ lẫn nhau để bảo vệ nhà nước này khỏi tham nhũng .
Tôi sẽ đề nghị bạn sử dụng các mô-đun luồng . Bạn có thể sử dụng nó để khởi chạy và theo dõi các chủ đề đang chạy. Hỗ trợ luồng của Python hoàn toàn trống rỗng, nhưng mô tả về vấn đề của bạn cho thấy rằng nó hoàn toàn đủ cho nhu cầu của bạn.
Cuối cùng, nếu bạn muốn xem một ứng dụng đơn giản xinh đẹp của một ứng dụng mạng song song viết bằng Python, hãy kiểm tra ssh.py . Đó là một thư viện nhỏ sử dụng luồng Python để song song nhiều kết nối SSH. Thiết kế đủ gần với yêu cầu của bạn mà bạn có thể thấy nó là một tài nguyên tốt.