Хороший підхід до вирішення цієї проблеми полягає в тому, щоб спочатку написати код, необхідний для отримання одного результату, а потім включити нитку коду для паралелізації програми.
У ідеальному світі це просто означатиме одночасне започаткування 100 000 потоків, які виводять свої результати у словник або список для подальшої обробки, але на практиці ви обмежені тим, скільки паралельних запитів HTTP ви можете видати таким чином. Місцево, у вас є обмеження в тому, скільки сокет ви можете одночасно відкривати, скільки потоків виконання вашого інтерпретатора Python дозволить. Віддалено ви можете обмежитися кількістю одночасних з'єднань, якщо всі запити проти одного сервера або декількох. Ці обмеження, ймовірно, потребують того, що ви будете писати сценарій таким чином, щоб за один раз опитати лише невелику частину URL-адрес (100, як згадується інший плакат, - це, мабуть, пристойний розмір пулу потоків, хоча ви можете виявити, що ви може успішно розгорнути ще багато).
Ви можете дотримуватися цієї схеми дизайну, щоб вирішити вищевказану проблему:
- Запустіть потік, який запускає нові потоки запитів, доки кількість поточних потоків, що виконуються в даний момент (ви можете відстежувати їх за допомогою threading.active_count () або шляхом натискання об'єктів потоку в структуру даних)>> ваша максимальна кількість одночасних запитів (скажімо, 100) , потім спить ненадовго. Цей потік повинен закінчуватися, коли більше URL-адрес обробляти не буде. Таким чином, нитка буде постійно прокидатися, запускати нові нитки і спати до тих пір, поки ваш не закінчиться.
- Попросіть потоки запитів зберігати свої результати в деякій структурі даних для подальшого пошуку та виведення. Якщо структура, в якій ви зберігаєте результати, - це
list
або dict
в CPython, ви можете сміливо додавати або вставляти унікальні елементи зі своїх потоків без замків , але якщо ви записуєте у файл або потребуєте більш складної взаємодії даних міжпотокових даних, ви повинні використовувати блокування взаємного виключення для захисту цієї держави від корупції .
Я б запропонував вам використовувати модуль різьблення . Ви можете використовувати його для запуску та відстеження запущених потоків. Підтримка нитки Python є голою, але опис вашої проблеми говорить про те, що вона цілком достатня для ваших потреб.
І, нарешті, якщо ви хочете , щоб побачити досить просто додаток паралельного мережевого додатки , написаного в Python, перевірити ssh.py . Це невелика бібліотека, яка використовує потоки Python для паралелізації багатьох з'єднань SSH. Дизайн досить близький до ваших вимог, щоб ви могли вважати його хорошим ресурсом.