ThreadPoolExecutor завершает работу до того, как очередь станет пустой ⇐ Python
-
Anonymous
ThreadPoolExecutor завершает работу до того, как очередь станет пустой
Моя цель — одновременно сканировать URL-адреса из очереди. В зависимости от результата сканирования очередь может быть расширена. Вот MWE:
очередь импорта из concurrent.futures импортировать ThreadPoolExecutor время импорта def get(url): # предположим, что здесь происходит магия HTTP время.сон(1) вернуть данные из {url}' def сканирование (url, url_queue: очередь.Очередь, result_queue: очередь.Очередь): данные = получить (URL-адрес) result_queue.put(данные) если «больше» в URL: url_queue.put('url_extended') url_queue = очередь.Очередь() result_queue = очередь.Очередь() для URL-адреса ('some_url', 'another_url', 'url_with_more', 'another_url_with_more', 'last_url'): url_queue.put(url) с ThreadPoolExecutor(max_workers=8) в качестве исполнителя: а не url_queue.empty(): URL = url_queue.get() executor.submit(сканирование, URL, url_queue, result_queue) а не result_queue.empty(): данные = result_queue.get() распечатать (данные) В этом MWE два URL-адреса требуют повторного сканирования: 'url_with_more' и 'another_url_with_more'. Они добавляются в url_queue во время сканирования.
Однако действие этого решения прекращается до того, как будут обработаны эти два «дополнительных» URL-адреса; после запуска в url_queue остаются две записи.
Как убедиться, что ThreadPoolExecutor не завершит работу слишком рано? Я неправильно понял ThreadPoolExecutor?
Моя цель — одновременно сканировать URL-адреса из очереди. В зависимости от результата сканирования очередь может быть расширена. Вот MWE:
очередь импорта из concurrent.futures импортировать ThreadPoolExecutor время импорта def get(url): # предположим, что здесь происходит магия HTTP время.сон(1) вернуть данные из {url}' def сканирование (url, url_queue: очередь.Очередь, result_queue: очередь.Очередь): данные = получить (URL-адрес) result_queue.put(данные) если «больше» в URL: url_queue.put('url_extended') url_queue = очередь.Очередь() result_queue = очередь.Очередь() для URL-адреса ('some_url', 'another_url', 'url_with_more', 'another_url_with_more', 'last_url'): url_queue.put(url) с ThreadPoolExecutor(max_workers=8) в качестве исполнителя: а не url_queue.empty(): URL = url_queue.get() executor.submit(сканирование, URL, url_queue, result_queue) а не result_queue.empty(): данные = result_queue.get() распечатать (данные) В этом MWE два URL-адреса требуют повторного сканирования: 'url_with_more' и 'another_url_with_more'. Они добавляются в url_queue во время сканирования.
Однако действие этого решения прекращается до того, как будут обработаны эти два «дополнительных» URL-адреса; после запуска в url_queue остаются две записи.
Как убедиться, что ThreadPoolExecutor не завершит работу слишком рано? Я неправильно понял ThreadPoolExecutor?