Я довольно новичок в python (я в основном пишу код на Java). У меня есть скрипт python, который по сути является сканером. Он вызывает phantomjs, который загружает страницу, возвращает ее источник и список URL-адресов, найденных на этой странице.Использование общей очереди, в которой рабочие могут добавлять задачи к
Я пытался использовать Python 3's multiprocessing
, чтобы сделать это, но я не могу понять, как использовать общую очередь, к которой могут добавить и рабочие. Я получаю непредсказуемые результаты.
В моем предыдущем подходе использовался глобальный список URL-адресов, из которого я извлек кусок и отправил работникам, используя map_async
. В конце я собирал все возвращенные URL-адреса и добавлял их в глобальный список. Проблема в том, что каждый «кусок» занимает столько же времени, сколько и самый медленный рабочий. Я пытаюсь изменить его, чтобы всякий раз, когда рабочий был сделан, он мог выбрать следующий URL-адрес. Однако я не думаю, что делаю это правильно. Вот что у меня есть до сих пор:
def worker(url, urls):
print(multiprocessing.current_process().name + "." + str(multiprocessing.current_process().pid) + " loading " + url)
returned_urls = phantomjs(url)
print(multiprocessing.current_process().name + "." + str(multiprocessing.current_process().pid) + " returning " + str(len(returned_urls)) + " URLs")
for returned_url in returned_urls:
urls.put(returned_url, block=True)
print("There are " + str(urls.qsize()) + " URLs in total.\n")
if __name__ == '__main__':
manager = multiprocessing.Manager()
urls = manager.Queue()
urls.append(<some-url>)
pool = Pool()
while True:
url = urls.get(block=True)
pool.apply_async(worker, (url, urls))
pool.close()
pool.join()
Если есть лучший способ сделать это, пожалуйста, дайте мне знать. Я просматриваю известный сайт, и конечное условие завершения - это когда нет URL-адресов для обработки. Но сейчас похоже, что я буду продолжать работать навсегда. Я не уверен, буду ли я использовать queue.empty()
, потому что он говорит, что он не является надежным.
См. Связанные: http://stackoverflow.com/questions/17241663/filling-a-queue-and-managing-multiprocessing-in-python (* Я не думаю, что ваш шаблон дизайна совершенно прав *) Я считаю вы хотите, чтобы сотрудники N обращались к общей очереди совместно. –
@JamesMills Этот пример имеет большой смысл! Можно ли добавить в очередь в 'worker_main'? –
Кроме того, я пробовал это, и похоже, что он выходит почти сразу, даже с 'time.sleep (10)'. Для вызова phantomjs требуется некоторое время, но сценарий завершается до этого. –