Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 2, 2011 09:58:27

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопросы про потоки

подскажите пожалуйста ответы на 2 вопроса:

1 использование epoll в питон3 позволяет как-то распараллелить задачи, подобно тому как это делает ThreadPoolExecutor?
я читал эту статью - http://habrahabr.ru/blogs/python/121103/ - но там показано как сделать многопоточный сервер, слушающий сокет
не совсем понятно, как допустим скачать 100 страниц через urllib параллельно, используя epoll

2 как использовать микропотоки stackless python? скачал его, установил, запустил такой пример:

import stackless
tasklets = []
for i in range(20):
tasklets.append(stackless.tasklet(load)(i))

tasklets[0].run()
где load(), функция, скачивающая одну веб-страницу
в итоге все это работает в один поток, по очереди и очень медленно, дольше чем ThreadPoolExecutor

как в стеклесс использовать микропотоки? как вообще получить в питоне нормальную многопоточность/многопроцессность, без GIL?



Офлайн

#2 Авг. 2, 2011 12:03:05

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

вопросы про потоки

Игнат
1 использование epoll в питон3 позволяет как-то распараллелить задачи, подобно тому как это делает ThreadPoolExecutor?
я читал эту статью - http://habrahabr.ru/blogs/python/121103/ - но там показано как сделать многопоточный сервер, слушающий сокет
там показан однопоточный сервер, только через epoll. Оно даст преимущество только если обработка данных вся на питоне, а если будут блокирующие вызовы - запись в бд, вызов внешних проиложений и т.п. то многопоточное приложение будет выгодней. Хотя можно попробовать соместить epoll и потоки =)

Игнат
не совсем понятно, как допустим скачать 100 страниц через urllib параллельно, используя epoll
как в стеклесс использовать микропотоки? как вообще получить в питоне нормальную многопоточность/многопроцессность, без GIL?
urllib написан на сокетах (по крайней мере питон 2,х), поэтому можно переписать ту часть где идет создание сокета, отправка запроса и прием данных на epoll, это вроде HTTPConnection и socket.create_connection.
возможно в инете где-то уже есть решение.

Офлайн

#3 Авг. 2, 2011 12:09:21

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

вопросы про потоки

Если цель выкачать много страниц - можете попробовать pycurl

Офлайн

#4 Авг. 2, 2011 13:02:46

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопросы про потоки

>>можете попробовать pycurl
не, цель не просто скачать, а ходить по редиректам, отправлять запросы, сохранять куки
курл пробовал ранее, он не умеет сам ходить по редиректам как урллиб

>>Оно даст преимущество только если обработка данных вся на питоне, а если будут блокирующие вызовы - запись в бд, вызов внешних проиложений и т.п. то многопоточное приложение будет выгодней

в моем случае запись в БД будет выполняться главным потоком через очередь queue, вся работа заключается только в запросах urllib и обработке их данных

стандартные потоки на данный момент не устраивают тем, что грузят процессор на 100%, даже если ничего не делают


и все же, как запустить тасклеты параллельно?



Офлайн

#5 Авг. 2, 2011 13:16:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

вопросы про потоки

> стандартные потоки на данный момент не устраивают тем, что грузят процессор на 100%, даже если ничего не делают
Как так?

# coding: utf8

import thread
import time

def myThread(param):
time.sleep(10)
print param

for i in xrange(100):
thread.start_new_thread(myThread, (i,))
print 'full start'
time.sleep(12)
print 'exit'
100 потоков которые ничего не делают - не малейшей нагрузки

Офлайн

#6 Авг. 2, 2011 13:51:35

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

вопросы про потоки

Игнат
курл пробовал ранее, он не умеет сам ходить по редиректам как урллиб
Неправда:
curl.setopt(pycurl.FOLLOWLOCATION, 1)



Офлайн

#7 Авг. 2, 2011 14:25:19

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопросы про потоки

>>Неправда:
>>curl.setopt(pycurl.FOLLOWLOCATION, 1)

я два года писал на пхп и юзал курл
сейчас совсем не хочется с ним связываться, имея urllib, который все делает сам
к тому же читал что курл в питоне все-таки не очень хорош, т.к. он неродной
та же ситуация с ним была и в C++/qt - родные средства библиотек работают лучше чем сторонний курл

про тормоза потоков - спасибо! благодаря отдельным тестам я понял что сжирает проц что-то в моем софте. буду искать



Офлайн

#8 Авг. 2, 2011 16:00:26

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопросы про потоки

все же понял как параллельно запустить тасклеты:

	import stackless

for i in range(10):
t = stackless.tasklet(load)(i)

while stackless.getruncount() != 1:
t = stackless.run(1000)

if t:
t.insert()
но вот беда:
threadpoolexecutor в 10 потоков скачивает главную страницу сайта за 0.74 сек
а то же самое, порученное тасклетам работаем никак не меньше 2.20 сек

я что-то делаю не так или у них преимущество в чем-то другом?



Офлайн

#9 Авг. 2, 2011 18:33:18

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

вопросы про потоки

Игнат
threadpoolexecutor в 10 потоков скачивает главную страницу сайта за 0.74 сек
а то же самое, порученное тасклетам работаем никак не меньше 2.20 сек
Если кол-во потоков одинаково, то решающим фактором будет скорость отдачи (приема) контента от сервера.

> родные средства библиотек работают лучше чем сторонний курл
совсем не факт, вот например человек с курл на питоне добился более 1к запросов в сек.

Офлайн

#10 Авг. 4, 2011 10:31:16

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопросы про потоки

спасибо
но проблема-то как раз в том, что недостаточно мне просто скачать 1 страницу
надо скачать, затем с этими же куками ещё что-то скачать, отправить запрос - и все это в течении одной сессии

разве же можно вести 1000 параллельных сессий с мультикурлом?

>>Если кол-во потоков одинаково, то решающим фактором будет скорость отдачи (приема) контента от сервера.
я запускал многократно
треды всегда возвращали примерно 0.7, а тасклеты 2.20



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version