Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111

Queue в multiprocessing.dummy

02.01.2017, 21:09. Показов 2416. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, имеется следующий код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from multiprocessing.dummy import Queue, Process
from selenium import webdriver
 
def visiter(url):
    task = url.get() #берем ссылку из очереди
    print('Задача:', task)
    driver = webdriver.PhantomJS(executable_path=r'C:\phantomjs-2.1.1-windows\bin\phantomjs.exe')
    myurl = driver.get(task) #подставляем ссылку
    print(myurl.page_source) #на этом этапе выбивает ошибку, приведенную ниже
    task.task_done()
    driver.quit()
    print('Задача завершена!')
 
my_tk = ['http://www.python.org',
    'http://www.python.org/about/',
    'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
    'http://www.python.org/doc/',
        ]
 
urls = Queue()
 
for i in my_tk:
    urls.put(i)
 
for i in range(2):
    p = Process(target=visiter, args=(urls,))
    p.start()
При выполнении открывает фантомжс, но после этого выбивает ошибку:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Usersлеб\AppData\Local\Programs\Python\Python35\lib\threading.py", line 914, in _bootstrap_inner
    self.run()
  File "C:\Usersлеб\AppData\Local\Programs\Python\Python35\lib\threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Usersлеб\Desktop\Python\multiprocessing____dummy(test queue).py", line 9, in visiter
    print(myurl.page_source)
AttributeError: 'NoneType' object has no attribute 'page_source'
 
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Usersлеб\AppData\Local\Programs\Python\Python35\lib\threading.py", line 914, in _bootstrap_inner
    self.run()
  File "C:\Usersлеб\AppData\Local\Programs\Python\Python35\lib\threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Usersлеб\Desktop\Python\multiprocessing____dummy(test queue).py", line 9, in visiter
    print(myurl.page_source)
AttributeError: 'NoneType' object has no attribute 'page_source'
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2017, 21:09
Ответы с готовыми решениями:

Multiprocessing Queue vs multiprocessing.Manager Queue
Если кому интересно: обычная Queue из мультитпроцессинга имеет ограничение по размеру, если туда забивать объекты не считывая. а очередь из...

Multiprocessing. Queue и SimpleQueue
День добрый. Скажите, пожалуйста, в чем разница между Queue и SimpleQueue в модуле Multiprocessing?

Код с multiprocessing и очередью Queue после компиляции через pyinstaller работает неправильно
Добрый день. На форуме первый раз. Если что не так оформлю, не рубите голову сразу. На Python писать начал ну совсем недавно....

11
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
02.01.2017, 23:58
Лучший ответ Сообщение было отмечено weblord как решение

Решение

Цитата Сообщение от weblord Посмотреть сообщение
print(myurl.page_source)
конечно, page_source это проперти драйвера

Python
1
print(driver.page_source)
1
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 01:58  [ТС]
Спасибо, затупил я)

Добавлено через 38 минут
Все работает, но созданные потоки почему-то берут по одной задаче из очереди, а после этого работа прекращается..
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
03.01.2017, 04:54
все как написано - так и работает, создается два процесса, каждый хватает по урлу, качает, показывает сорц и дохнет.

ну и тут
Python
1
    task.task_done()
не понятно, что произошло.
0
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 10:04  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
не понятно, что произошло.
Поправил, там должно быть
Python
1
url.task_done()
Цитата Сообщение от Jabbson Посмотреть сообщение
все как написано - так и работает, создается два процесса, каждый хватает по урлу, качает, показывает сорц и дохнет.
Правильно, но урлов в очереди 4, а не 2. А берет по одному, хотя по идее должны работать потоки, пока не закончатся ВСЕ задания в очереди. Или я что-то не так понимаю?)
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
03.01.2017, 15:56
Цитата Сообщение от weblord Посмотреть сообщение
А берет по одному
как написано - так и берет - для каждого процесса (которых два) ровно один раз выполняется task = url.get(), откуда бы функция брала по два урла?
1
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 17:05  [ТС]
Спасибо! А чтобы потоки работали до завершения всех задач из очереди, надо через цикл while работать?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
03.01.2017, 19:19
сделайте пул из двух процессов и скормите им лист

Python
1
2
pool = Pool(processes=2)
results = pool.map(visiter, my_tk)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.01.2017, 21:46
weblord,
А зачем вам процессы?
Любой мультипоточный вариант с map\apply\map_async\apply_async для распараллеливания запросов работает быстрее, чем через создание доп. процессов.
0
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111
04.01.2017, 14:20  [ТС]
Насколько я знаю, потокам мешает GIL в некоторой степени, а также есть риск проблем с памятью, потому что она общая. У процессов таких проблем нет, хоть они и берут больше ресурсов.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.01.2017, 15:10
Дэвид Бизли:
"Потоки удерживают GIL, пока выполняются. Однако они освобождают его при блокировании для операций ввода-вывода. Каждый раз, когда поток вынужден ждать, другие, готовые к выполнению, потоки используют свой шанс запуститься."
Что делает задача запрашивая у сервера страницу? Она ждет ответа. GIL-у тут нечего делать. GIL контролирует CPU-based задачи, требующие вычислительных мощностей. IO-задачи имеют возможность выполняться с минимальным вмешательством GIL.
И то что потоки здесь эффективнее, проверяется простыми тестами на скорость выполнения.

Цитата Сообщение от weblord Посмотреть сообщение
а также есть риск проблем с памятью, потому что она общая. У процессов таких проблем нет, хоть они и берут больше ресурсов.
Зато у процессов есть другие проблемы - например переход границ процессов для межпроцессного взаимодействия и сам процесс создания нового процесса дешев только на UNIX. Попробуйте запустить 100 процессов (копий интерпретатора) - хватит ли памяти вашей машине? А 100 потоков на 100 http-запросов без проблем отработают с минимальными затратами и с многократным ускорением относительно последовательного выполнения и, скорей всего, даже на ~20-100 % быстрее многопроцессного выполнения.

P.S. В любом случае, прежде чем использовать какой-то вариант, стоит просто сделать профилирование кода на скорость и память, чтобы убедиться лично в эффективности того или иного способа, нежели делать поспешные умозаключения на основании разрозненных и недостаточно хорошо понятых выборках прочитанной информации.
1
1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111
04.01.2017, 18:40  [ТС]
Спасибо, учту
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2017, 18:40
Помогаю со студенческими работами здесь

main.cpp:(.text+0x1f4): undefined reference to `Queue<int>::~Queue()
Выдаёт ошибку о проблеме деструктора. Пытался саму функцию destroy вставить в деструктор, но то же самое. Изначально destroy находилась в...

Разница между finalization queue и freachable queue
Всем привет, все как-то никак не могу понять, в чем разница

Разница между queue.synchronized и concurrent queue
По сути 2 коллекции потокобезопасные, что лучше использовать? Queue que = Queue.Synchronized(new Queue()); // или...

Переполнение Queue, методы оптимизации Queue
Доброго времени суток. Я тут планирую пенгатон взять под контроль.:- StreamReader sr = new StreamReader(road); ...

Queue vs Queue.Synchronized vs ConcurrentQueue
Ситуация такова, что один поток постоянно толкает в очередь объекты (Enqueue), а второй забирает (Dequeue/TryDequeue), и ни эти потоки, ни...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru