1 / 1 / 2
Регистрация: 16.10.2016
Сообщений: 111

Queue в multiprocessing.dummy

02.01.2017, 21:09. Показов 2424. Ответов 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): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru