Найти - Пользователи
Полная версия: Pool threading
Начало » Python для новичков » Pool threading
1 2 3 4
Skyler
В общем хочется разобраться, но я сам не понимаю пока, как все это реализовывается в очереди. Чтобы, допустим, на 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-потокам, они висят где-то фоном, и постоянно обращаются к нашей очереди. Когда в очереди появляется новый элемент, какой-то из потоков хватает его и идет выполнять, остальные ждут. И так по мере появления новых элементов в очереди, потоки будут брать и обрабатывать их.
Я все правильно понимаю?
Skyler
После запуска очереди потоков, первые задачи выполняются быстро, но вот последние несколько идут оооочень медленно. Несмотря на то, что я под 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
Хм, никто из форумчан не умеет пользоваться потоками?…
HedgeHog
Skyler
Хм, никто из форумчан не умеет пользоваться потоками?…
Вы создаете очень много потоков. Основное время, когда их висит в памяти 100 штук, уходит на переключение между ними, а на не исполнение программного кода в потоковой функции. если я все правильно понял. :)
Skyler
Т.е. падение производительности в конце из-за кол-ва потоков?
DHT
А винда пропатчена на кол-во полуоткрытых соединений? По умолчанию в целях безопасности вроде 25 всего идет.
И чисто теоретически рискну предположить, что поскольку потоки просто висят, то слишком часто опрашивают не появилась ли новая задача. Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.
pasaranax
Извините за офтопик, а зачем столько потоков?
Skyler
DHT
DHT
Попробуй сделать sleep в потоке перед запросом “появилась ли новая задача”.
Какое значение для sleep указывать?
pasaranax
Извините за офтопик, а зачем столько потоков?
Скорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
DHT
А винда пропатчена на кол-во полуоткрытых соединений?
Семерка патчится? Знаю только про XP.
pasaranax
Skyler
Скорость выполнения задачи. Просто я точно не знаю, сколько потоков являются оптимальным выборов для достижения максимальной производительности.
Например, при компилировании, рекомендуют устанавливать количество потоков равным количеству ядер + 1. По-моему, это логично. Попробуй засечь за какое время справляется с задачей количество потоков по данной формуле и в 10 раз большее.
DHT
sleep
Skyler
Какое значение для sleep указывать?
например 100мс.

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