Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2009 16:10:37

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Pool threading

Skyler
Хм, но ведь кол-во потоков под 100 дает реально быструю производительность, задания выполняются быстро, исключая последние несколько. А в 3 потока вообще о производительности говорить нельзя.
Потоки нормально работают с ожиданием, поэтому и быстро.

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

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

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



Офлайн

#2 Окт. 30, 2009 18:19:23

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

Pool threading

Код хотя бы правильный?)

#!/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



Отредактировано (Окт. 30, 2009 18:22:04)

Офлайн

#3 Окт. 30, 2009 18:35:21

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Pool threading

а я б использовал urllib2

Офлайн

#4 Окт. 31, 2009 04:21:37

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

Pool threading

sypper-pit
Разница?



Офлайн

#5 Ноя. 1, 2009 19:50:13

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Pool threading

Skyler
В остальное время не больше 100кбит, а канал у меня на 800.
может: канал 800кбит, а скачиваний 100кбАйт, тогда все сходится :)

Офлайн

#6 Ноя. 1, 2009 19:53:03

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Pool threading

Skyler
        while 1:
pass
я думаю что этот кусок кода будет производить основную нагрузку на процессор
и вообще зачем бесконечные циклы в конце программы?

Отредактировано (Ноя. 1, 2009 19:55:13)

Офлайн

#7 Ноя. 2, 2009 22:59:37

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Pool threading

Skyler
Разница?
Работа с прокси проще…

Офлайн

#8 Ноя. 3, 2009 00:28:18

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Pool threading

Skyler, у меня сейчас нет времени вчитываться, но бесконечный пасс взорвал мой мозг и вскипятил тебе чай на проце.
И sleep na воткнул вовсе не там… Подумай ещё.



Отредактировано (Ноя. 3, 2009 00:29:26)

Офлайн

#9 Ноя. 3, 2009 01:49:48

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

Pool threading

Я тут один туториал читал по pygame, так там приводится пример с бесконечным циклом:

def input(events): 
for event in events:
if event.type == QUIT:
sys.exit(0)
else:
print event

while True:
input(pygame.event.get())
Грузит ядро на полную. Это косячный туториал или тут есть какой-то глубинный смысл? :)



Офлайн

#10 Ноя. 3, 2009 02:43:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Pool threading

Нет смысла. К тому же это - tutorial. Не судите его строго.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version