Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2010 16:24:23

topazz
От:
Зарегистрирован: 2008-09-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Раблота с потоками и таймаутом соединения urllib2

Добрый день, подскажите как заставить говнокод работать!

Ниже кусок одного класса.
Вызов метода Start запускает 500 потоков, которые начинают разбирать очередь состоящую из проксей,
делая запросы на 2 сайта, если они получают html, то кладут его в другую очередь и идут дальше.

В принципе все работает, но после того как очередь обработалась (proxylist.join()), остается несколько потоков которые почему-то остаются запущенными. Не могу понять почему так происходит.

В принципе я могу собрать все потоки в лист дождаться окончания очереди, а потом сделать всем затупившим нитям что-то типа thread._Thread__stop.
Но мне кажется это не правильные метод.

1. Где то место в моем коде, которое может вызвать зависание потока?
2. Как выйти из потока по времени его выполнения (сказать Worker, что он может насиловать итем из очереди не более X времени)?


    def Opener(self, url, headers, post=None, proxy=None, timeout=None):
socket.setdefaulttimeout(timeout)
upars = urlparse.urlparse(url)
self.headers['Host']= upars.netloc
if proxy:
proxy_handler = urllib2.ProxyHandler({'http':proxy})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
socket.setdefaulttimeout(self._Setting.proxy['TimeOut'])
if post:
post = urllib.urlencode(post)
req = urllib2.Request(url, post, headers)
try:
conn = urllib2.urlopen(req)
html, info = conn.read(), conn.info()
if html
return(html, info)
else: return False
except:
return False


def Worker(self):
while not self.proxylist.empty():
try: prox = self.proxylist.get()
except: prox = False
if prox:
curentproxy = prox.split(':')[0]
scripthtml = self.Opener(url='http://site1.ru/', headers=self.headers, post = {'zpost':'zpost'}, proxy = prox)
if scripthtml:
kthtml = self.Opener(url='http://site2.ru/', headers=self.headers, post = None, proxy=prox, timeout=20)
if kthtml:
self.htmlForParse.put_nowait((prox, scripthtml[0], kthtml[0]))
self.proxylist.task_done()
time.sleep(0.1)

def Start(self):
for x in xrange(500):
p = threading.Thread(target = self.Worker)
p.setName('Worker' + str(x))
p.start()

self.proxylist.join()



Отредактировано (Фев. 7, 2010 16:27:37)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version