Найти - Пользователи
Полная версия: вопросы про потоки
Начало » Python для новичков » вопросы про потоки
1 2
Игнат
подскажите пожалуйста ответы на 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?
o7412369815963
Игнат
1 использование epoll в питон3 позволяет как-то распараллелить задачи, подобно тому как это делает ThreadPoolExecutor?
я читал эту статью - http://habrahabr.ru/blogs/python/121103/ - но там показано как сделать многопоточный сервер, слушающий сокет
там показан однопоточный сервер, только через epoll. Оно даст преимущество только если обработка данных вся на питоне, а если будут блокирующие вызовы - запись в бд, вызов внешних проиложений и т.п. то многопоточное приложение будет выгодней. Хотя можно попробовать соместить epoll и потоки =)

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

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

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

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


и все же, как запустить тасклеты параллельно?
o7412369815963
> стандартные потоки на данный момент не устраивают тем, что грузят процессор на 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 потоков которые ничего не делают - не малейшей нагрузки
plusplus
Игнат
курл пробовал ранее, он не умеет сам ходить по редиректам как урллиб
Неправда:
curl.setopt(pycurl.FOLLOWLOCATION, 1)
Игнат
>>Неправда:
>>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 сек

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

> родные средства библиотек работают лучше чем сторонний курл
совсем не факт, вот например человек с курл на питоне добился более 1к запросов в сек.
Игнат
спасибо
но проблема-то как раз в том, что недостаточно мне просто скачать 1 страницу
надо скачать, затем с этими же куками ещё что-то скачать, отправить запрос - и все это в течении одной сессии

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

>>Если кол-во потоков одинаково, то решающим фактором будет скорость отдачи (приема) контента от сервера.
я запускал многократно
треды всегда возвращали примерно 0.7, а тасклеты 2.20
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB