Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2009 17:00:38

Skyler
От:
Зарегистрирован: 2009-07-23
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

В общем хочется разобраться, но я сам не понимаю пока, как все это реализовывается в очереди. Чтобы, допустим, на 100 задача, который надо обработать, выделялось 10 потоков и те разбирали задачи, как только сделают уже взятую. Я уже умею выделять n-потоков для n-задач.
Нарыл такой код в нете:

          
#!/usr/bin/env python
import Queue
import threading
import urllib2
import time

hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com",
"http://ibm.com", "http://apple.com"]

queue = Queue.Queue() #создание экземпляра класса, организующего очередь

class ThreadUrl(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

def run(self):
while True:
host = self.queue.get() #выбираем первый элемент из очереди

url = urllib2.urlopen(host) # обрабатываем
print url.read(1024) # его

self.queue.task_done() # вот это не понимаю зачем здесь

start = time.time()
def main():

# создаем 5 потоков. только не понятно, что они будут делать, если очередь сейчас пуста? просто в фоне висеть?
for i in range(5):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()
# только здесь мы добавляем элемент в очередь
for host in hosts:
queue.put(host)
# не понимаю, зачем join() здесь
queue.join()

main()
print "Elapsed Time: %s" % (time.time() - start)
В общем: даем жизнь n-потокам, они висят где-то фоном, и постоянно обращаются к нашей очереди. Когда в очереди появляется новый элемент, какой-то из потоков хватает его и идет выполнять, остальные ждут. И так по мере появления новых элементов в очереди, потоки будут брать и обрабатывать их.
Я все правильно понимаю?



Отредактировано (Окт. 26, 2009 17:12:53)

Офлайн

#2 Окт. 28, 2009 15:46:37

Skyler
От:
Зарегистрирован: 2009-07-23
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

После запуска очереди потоков, первые задачи выполняются быстро, но вот последние несколько идут оооочень медленно. Несмотря на то, что я под 74 задачи выделил 100 потоков, последние ужасно тормозят. Вот код, подскажите пжл, что не так:

#!/usr/bin/python

import urllib, sys, threading, Queue, datetime
start = datetime.datetime.today().second+int(datetime.datetime.today().minute)*60
proxylist = open('proxy.txt', 'r')
count = len(proxylist.readlines())

proxylist = open('proxy.txt', 'r')
goodproxy = open('goodproxy.txt', 'w')
countproxy = count

class thread(threading.Thread):
def run(self):
while 1:
global countproxy
proxy = proxypool.get()
if proxy != None:
proxies = {'http': 'http://'+proxy}
try:
urllib.urlopen('http://google.ru', proxies=proxies)
goodproxy.write(proxy)
countproxy = countproxy - 1
print countproxy
#sys.stdout.write('\r'+'Proxy left -- '+'%d' % countproxy)
#sys.stdout.flush()
except:
countproxy = countproxy - 1
print countproxy
#sys.stdout.write('\r'+'Proxy left -- '+'%d' % countproxy)
#sys.stdout.flush()
proxypool.task_done()


proxypool = Queue.Queue()
threads = 100

for i in range(threads):
t = thread()
t.setDaemon(True)
t.start()

for line in proxylist.readlines():
proxypool.put(line)

while 1:
if countproxy == 1:
proxylist.close()
goodproxy.close()
end = datetime.datetime.today().second+int(datetime.datetime.today().minute)*60
result = int(end)-int(start)
print 'Time: '.result
break



Офлайн

#3 Окт. 28, 2009 20:00:46

Skyler
От:
Зарегистрирован: 2009-07-23
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

Хм, никто из форумчан не умеет пользоваться потоками?…



Офлайн

#4 Окт. 28, 2009 21:19:37

HedgeHog
От:
Зарегистрирован: 2009-10-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

Skyler
Хм, никто из форумчан не умеет пользоваться потоками?…
Вы создаете очень много потоков. Основное время, когда их висит в памяти 100 штук, уходит на переключение между ними, а на не исполнение программного кода в потоковой функции. если я все правильно понял. :)



Офлайн

#5 Окт. 28, 2009 21:34:17

Skyler
От:
Зарегистрирован: 2009-07-23
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

Т.е. падение производительности в конце из-за кол-ва потоков?



Офлайн

#6 Окт. 28, 2009 21:49:32

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

А винда пропатчена на кол-во полуоткрытых соединений? По умолчанию в целях безопасности вроде 25 всего идет.
И чисто теоретически рискну предположить, что поскольку потоки просто висят, то слишком часто опрашивают не появилась ли новая задача. Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.



Офлайн

#7 Окт. 28, 2009 22:04:00

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

Извините за офтопик, а зачем столько потоков?



Офлайн

#8 Окт. 28, 2009 22:20:50

Skyler
От:
Зарегистрирован: 2009-07-23
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

DHT

DHT
Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.
Какое значение для sleep указывать?
pasaranax
Извините за офтопик, а зачем столько потоков?
Скорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
DHT
А винда пропатчена на кол-во полуоткрытых соединений?
Семерка патчится? Знаю только про XP.



Офлайн

#9 Окт. 28, 2009 23:17:01

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

Skyler
Скорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
Например, при компилировании, рекомендуют устанавливать количество потоков равным количеству ядер + 1. По-моему, это логично. Попробуй засечь за какое время справляется с задачей количество потоков по данной формуле и в 10 раз большее.



Офлайн

#10 Окт. 28, 2009 23:34:29

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Pool threading

sleep

Skyler
Какое значение для sleep указывать?
например 100мс.

pasaranax
рекомендуют устанавливать количество потоков равным количеству ядер + 1
ну это если каждый поток грузит проц на 100%, а если каждому потоку хватает меньше 1% ресурсов процессора, то скокрость программы будет расти вместе с ростом потоков.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version