Форум сайта python.su
подскажите пожалуйста ответы на 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()
Офлайн
Игнаттам показан однопоточный сервер, только через epoll. Оно даст преимущество только если обработка данных вся на питоне, а если будут блокирующие вызовы - запись в бд, вызов внешних проиложений и т.п. то многопоточное приложение будет выгодней. Хотя можно попробовать соместить epoll и потоки =)
1 использование epoll в питон3 позволяет как-то распараллелить задачи, подобно тому как это делает ThreadPoolExecutor?
я читал эту статью - http://habrahabr.ru/blogs/python/121103/ - но там показано как сделать многопоточный сервер, слушающий сокет
Игнатurllib написан на сокетах (по крайней мере питон 2,х), поэтому можно переписать ту часть где идет создание сокета, отправка запроса и прием данных на epoll, это вроде HTTPConnection и socket.create_connection.
не совсем понятно, как допустим скачать 100 страниц через urllib параллельно, используя epoll
как в стеклесс использовать микропотоки? как вообще получить в питоне нормальную многопоточность/многопроцессность, без GIL?
Офлайн
Если цель выкачать много страниц - можете попробовать pycurl
Офлайн
>>можете попробовать pycurl
не, цель не просто скачать, а ходить по редиректам, отправлять запросы, сохранять куки
курл пробовал ранее, он не умеет сам ходить по редиректам как урллиб
>>Оно даст преимущество только если обработка данных вся на питоне, а если будут блокирующие вызовы - запись в бд, вызов внешних проиложений и т.п. то многопоточное приложение будет выгодней
в моем случае запись в БД будет выполняться главным потоком через очередь queue, вся работа заключается только в запросах urllib и обработке их данных
стандартные потоки на данный момент не устраивают тем, что грузят процессор на 100%, даже если ничего не делают
и все же, как запустить тасклеты параллельно?
Офлайн
> стандартные потоки на данный момент не устраивают тем, что грузят процессор на 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'
Офлайн
ИгнатНеправда:
курл пробовал ранее, он не умеет сам ходить по редиректам как урллиб
Офлайн
>>Неправда:
>>curl.setopt(pycurl.FOLLOWLOCATION, 1)
я два года писал на пхп и юзал курл
сейчас совсем не хочется с ним связываться, имея urllib, который все делает сам
к тому же читал что курл в питоне все-таки не очень хорош, т.к. он неродной
та же ситуация с ним была и в C++/qt - родные средства библиотек работают лучше чем сторонний курл
про тормоза потоков - спасибо! благодаря отдельным тестам я понял что сжирает проц что-то в моем софте. буду искать
Офлайн
все же понял как параллельно запустить тасклеты:
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 сек
Офлайн
спасибо
но проблема-то как раз в том, что недостаточно мне просто скачать 1 страницу
надо скачать, затем с этими же куками ещё что-то скачать, отправить запрос - и все это в течении одной сессии
разве же можно вести 1000 параллельных сессий с мультикурлом?
>>Если кол-во потоков одинаково, то решающим фактором будет скорость отдачи (приема) контента от сервера.
я запускал многократно
треды всегда возвращали примерно 0.7, а тасклеты 2.20
Офлайн