Форум сайта python.su
В общем хочется разобраться, но я сам не понимаю пока, как все это реализовывается в очереди. Чтобы, допустим, на 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)
Отредактировано (Окт. 26, 2009 17:12:53)
Офлайн
После запуска очереди потоков, первые задачи выполняются быстро, но вот последние несколько идут оооочень медленно. Несмотря на то, что я под 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
Офлайн
Хм, никто из форумчан не умеет пользоваться потоками?…
Офлайн
SkylerВы создаете очень много потоков. Основное время, когда их висит в памяти 100 штук, уходит на переключение между ними, а на не исполнение программного кода в потоковой функции. если я все правильно понял. :)
Хм, никто из форумчан не умеет пользоваться потоками?…
Офлайн
Т.е. падение производительности в конце из-за кол-ва потоков?
Офлайн
А винда пропатчена на кол-во полуоткрытых соединений? По умолчанию в целях безопасности вроде 25 всего идет.
И чисто теоретически рискну предположить, что поскольку потоки просто висят, то слишком часто опрашивают не появилась ли новая задача. Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.
Офлайн
Извините за офтопик, а зачем столько потоков?
Офлайн
DHT
DHTКакое значение для sleep указывать?
Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.
pasaranaxСкорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
Извините за офтопик, а зачем столько потоков?
DHTСемерка патчится? Знаю только про XP.
А винда пропатчена на кол-во полуоткрытых соединений?
Офлайн
SkylerНапример, при компилировании, рекомендуют устанавливать количество потоков равным количеству ядер + 1. По-моему, это логично. Попробуй засечь за какое время справляется с задачей количество потоков по данной формуле и в 10 раз большее.
Скорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
Офлайн
sleep
Skylerнапример 100мс.
Какое значение для sleep указывать?
pasaranaxну это если каждый поток грузит проц на 100%, а если каждому потоку хватает меньше 1% ресурсов процессора, то скокрость программы будет расти вместе с ростом потоков.
рекомендуют устанавливать количество потоков равным количеству ядер + 1
Офлайн