Найти - Пользователи
Полная версия: Pool threading
Начало » Python для новичков » Pool threading
1 2 3 4
ZZZ
Skyler
Хм, но ведь кол-во потоков под 100 дает реально быструю производительность, задания выполняются быстро, исключая последние несколько. А в 3 потока вообще о производительности говорить нельзя.
Потоки нормально работают с ожиданием, поэтому и быстро.

Skyler
Вот про это можно поподробней? Т.е. как бы перегружая канал выполнением большого кол-ва задач за короткое время, канал начинает “тупить”? А если применять задержки, не загружая его сильно?
Поясню.
Допустим, через канал может пройти тысяча запросов за одну секунду, а процессор пытается вогнать туда две тысячи. Исходящие запросы просто уходят в буфер сетевухи (драйверов, сетевого ядра ОС… не важно) и там ждут своей очереди. Поэтому первая тысяча запросов нормально, а вторая не очень.
При этом следует отметить, что канал, на самом деле, обычно не совсем полнодуплексный. Т.е. отправляющаяся пачка запросов, мешает принимающейся пачке ответов… Но это уже совсем дебри.

Skyler
time.sleep(100)
Срочно читаем документацию: ожидание в сто секунд, это, конечно, интересно, но явно не то, чего вы ожидаете.

ИМХО, у вас изначально немного неправильный подход. Сначала отдельно создайте объект-пулл нитей и давайте ему задания.
Кстати, пулл можно красиво организовать с помощью Queue.Queue.
Skyler
Код хотя бы правильный?)
#!/usr/bin/python

import urllib, sys, threading, Queue, datetime, time
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()
#time.sleep(0.1)
if proxy != None:
proxies = {'http': 'http://'+proxy}
try:
urllib.urlopen(url, 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 = 80
url = 'http://google.ru'
#t = thread()
# заполнил очередь
for line in proxylist.readlines():
proxypool.put(line)
# пустил потоки
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 ''
print '--------'
print 'Time: '+str(result)
while 1:
pass
sypper-pit
а я б использовал urllib2
Skyler
sypper-pit
Разница?
o7412369815963
Skyler
В остальное время не больше 100кбит, а канал у меня на 800.
может: канал 800кбит, а скачиваний 100кбАйт, тогда все сходится :)
o7412369815963
Skyler
        while 1:
pass
я думаю что этот кусок кода будет производить основную нагрузку на процессор
и вообще зачем бесконечные циклы в конце программы?
sypper-pit
Skyler
Разница?
Работа с прокси проще…
ZZZ
Skyler, у меня сейчас нет времени вчитываться, но бесконечный пасс взорвал мой мозг и вскипятил тебе чай на проце.
И sleep na воткнул вовсе не там… Подумай ещё.
pasaranax
Я тут один туториал читал по pygame, так там приводится пример с бесконечным циклом:
def input(events): 
for event in events:
if event.type == QUIT:
sys.exit(0)
else:
print event

while True:
input(pygame.event.get())
Грузит ядро на полную. Это косячный туториал или тут есть какой-то глубинный смысл? :)
Андрей Светлов
Нет смысла. К тому же это - tutorial. Не судите его строго.
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