Форум программистов, компьютерный форум CyberForum.ru

Queue в multiprocessing.dummy - Python

Восстановить пароль Регистрация
 
weblord
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 99
02.01.2017, 21:09     Queue в multiprocessing.dummy #1
Всем привет, имеется следующий код:

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'
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 21:09     Queue в multiprocessing.dummy
Посмотрите здесь:

Apache dummy-host.localhost
Вопрос по существу, а точнее по DUMMY FreeBSD
Ошибка: You have accidently used the dummy version of OwlMain C++
Python Multiprocessing
Delphi Queue
Message queue C#
C# Queue vs Queue.Synchronized vs ConcurrentQueue
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jabbson
Модератор
 Аватар для Jabbson
2917 / 2026 / 366
Регистрация: 03.11.2009
Сообщений: 6,410
Записей в блоге: 3
02.01.2017, 23:58     Queue в multiprocessing.dummy #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от weblord Посмотреть сообщение
print(myurl.page_source)
конечно, page_source это проперти драйвера

Python
1
print(driver.page_source)
weblord
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 99
03.01.2017, 01:58  [ТС]     Queue в multiprocessing.dummy #3
Спасибо, затупил я)

Добавлено через 38 минут
Все работает, но созданные потоки почему-то берут по одной задаче из очереди, а после этого работа прекращается..
Jabbson
Модератор
 Аватар для Jabbson
2917 / 2026 / 366
Регистрация: 03.11.2009
Сообщений: 6,410
Записей в блоге: 3
03.01.2017, 04:54     Queue в multiprocessing.dummy #4
все как написано - так и работает, создается два процесса, каждый хватает по урлу, качает, показывает сорц и дохнет.

ну и тут
Python
1
    task.task_done()
не понятно, что произошло.
weblord
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 99
03.01.2017, 10:04  [ТС]     Queue в multiprocessing.dummy #5
Цитата Сообщение от Jabbson Посмотреть сообщение
не понятно, что произошло.
Поправил, там должно быть
Python
1
url.task_done()
Цитата Сообщение от Jabbson Посмотреть сообщение
все как написано - так и работает, создается два процесса, каждый хватает по урлу, качает, показывает сорц и дохнет.
Правильно, но урлов в очереди 4, а не 2. А берет по одному, хотя по идее должны работать потоки, пока не закончатся ВСЕ задания в очереди. Или я что-то не так понимаю?)
Jabbson
Модератор
 Аватар для Jabbson
2917 / 2026 / 366
Регистрация: 03.11.2009
Сообщений: 6,410
Записей в блоге: 3
03.01.2017, 15:56     Queue в multiprocessing.dummy #6
Цитата Сообщение от weblord Посмотреть сообщение
А берет по одному
как написано - так и берет - для каждого процесса (которых два) ровно один раз выполняется task = url.get(), откуда бы функция брала по два урла?
weblord
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 99
03.01.2017, 17:05  [ТС]     Queue в multiprocessing.dummy #7
Спасибо! А чтобы потоки работали до завершения всех задач из очереди, надо через цикл while работать?
Jabbson
Модератор
 Аватар для Jabbson
2917 / 2026 / 366
Регистрация: 03.11.2009
Сообщений: 6,410
Записей в блоге: 3
03.01.2017, 19:19     Queue в multiprocessing.dummy #8
сделайте пул из двух процессов и скормите им лист

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

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

P.S. В любом случае, прежде чем использовать какой-то вариант, стоит просто сделать профилирование кода на скорость и память, чтобы убедиться лично в эффективности того или иного способа, нежели делать поспешные умозаключения на основании разрозненных и недостаточно хорошо понятых выборках прочитанной информации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2017, 18:40     Queue в multiprocessing.dummy
Еще ссылки по теме:

Error C2664: Client::First: невозможно преобразовать параметр 1 из "std::queue<_Ty>" в "std::queue<_Ty> &" C++
Multiprocessing mysql Python
Python Multiprocessing vs multithreding
Qt Bluetooth, ошибка qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional C++ Qt
Запись в файл multiprocessing Python

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

Или воспользуйтесь поиском по форуму:
weblord
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 99
04.01.2017, 18:40  [ТС]     Queue в multiprocessing.dummy #12
Спасибо, учту
Yandex
Объявления
04.01.2017, 18:40     Queue в multiprocessing.dummy
Ответ Создать тему
Опции темы

Текущее время: 23:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru