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

Python: Web

Войти
Регистрация
Восстановить пароль
 
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
#1

Queue в multiprocessing.dummy - Python

02.01.2017, 21:09. Просмотров 293. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 21:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Queue в multiprocessing.dummy (Python):

Multiprocessing - Python
В общем и целом, сбахал простейший скрипт для того, чтобы опробовать класс Process() из модуля multiprocessing. Выглядит он так: from...

Multiprocessing vs multithreding - Python
Здравствуйте! В python есть такие штуки как multithreding и multiprocessing. Но пока не нашел, где бы писали в каком случае, что лучше...

Multiprocessing mysql - Python
Господа, может кто-то поделиться знаниями и/или примером выполнения параллельного обращения к нескольким (30шт) mysql серверам.

Запись в файл multiprocessing - Python
Как организовать запись в файл, чтобы каждый процесс ожидал завершения предыдущего? from multiprocessing.dummy import Pool import...

Multiprocessing: Value и Pool.map() - Python
Есть код: from ctypes import c_int from multiprocessing import Process, Pool, Value, Lock def func(data): data.value...

Создать многопоточный процес с multiprocessing - Python
import requests import multiprocessing def par(k): file_pass = open("alll.txt", "r") file_pass = file_pass.read() ...

11
Jabbson
Модератор
Эксперт по компьютерным сетям
3152 / 2230 / 458
Регистрация: 03.11.2009
Сообщений: 7,030
Записей в блоге: 3
02.01.2017, 23:58 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от weblord Посмотреть сообщение
print(myurl.page_source)
конечно, page_source это проперти драйвера

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

Добавлено через 38 минут
Все работает, но созданные потоки почему-то берут по одной задаче из очереди, а после этого работа прекращается..
0
Jabbson
Модератор
Эксперт по компьютерным сетям
3152 / 2230 / 458
Регистрация: 03.11.2009
Сообщений: 7,030
Записей в блоге: 3
03.01.2017, 04:54 #4
все как написано - так и работает, создается два процесса, каждый хватает по урлу, качает, показывает сорц и дохнет.

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

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

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

P.S. В любом случае, прежде чем использовать какой-то вариант, стоит просто сделать профилирование кода на скорость и память, чтобы убедиться лично в эффективности того или иного способа, нежели делать поспешные умозаключения на основании разрозненных и недостаточно хорошо понятых выборках прочитанной информации.
1
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
04.01.2017, 18:40  [ТС] #12
Спасибо, учту
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2017, 18:40
Привет! Вот еще темы с ответами:

Threading и Queue непонятки в какакоде - Python
Доброго времени суток, Уважаемые Форумчане. Решил поковыряться в потоках на питоне. Написал простейший скриптик для этого - банально чекает...

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

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

dummy-host.localhost - Apache, htaccess
Доброе время суток. Я настраивал апач раньше, но склероз берет свое. У меня слетела система и я ее пытаюсь восстановить, было 2...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
04.01.2017, 18:40
Ответ Создать тему
Опции темы

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