Форум сайта python.su
т.е. с потоками я работать могу, просто сейчас когда решил использовать классы не совсем понятна логика работы в именно классе. Пожалуйста подскажите как правильно это реализовать.
# -*- coding: utf-8 -*-
import wx, urllib, re, time
class GUI(wx.Dialog):
def __init__(self, parent):
"""Часть кода упущена для экономии места"""
def Start(self, event):
main = Parser()
main.Start_parser(self.TcURL.GetValue(), self.filename)
main.count_str(self.filename)
def onOpenFile(self, event):
global dlg
dlg = wx.FileDialog(self, message="Choose a file", defaultFile="", wildcard = "Text file (*.txt)|*.txt|" "All files (*.*)|*.*", style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR)
if dlg.ShowModal() == wx.ID_OK:
paths = dlg.GetPaths()
self.filename = dlg.GetFilename()
dlg.Destroy()
class Parser:
def Start_parser(self, url, openfile):
global start_time
start_time = time.time()
f = open(openfile, 'w+')
count = 0
while count < 1000:
site = urllib.urlopen(url+'memberlist.php?start='+str(count)).read()
pattern = r'class=\"gen\">([^<]+)</a>'
users = re.compile(pattern)
users = re.findall(pattern, site)
count += 50
if len(users) == 0:
break
for user in users:
f.write(user.decode('windows-1251').encode('utf-8')+'\n')
print user
def count_str(self, openfile):
print ('Количество собраных логинов: %s' % (len(open(openfile, 'r').readlines())))
print ("Времени затрачено : %s" % (time.time() - start_time)+'\n')
"""Как сюда прикрутить потоки"""
Офлайн
Не понял в чём проблема.
class Parser(threading.Thread):
#{ Parser
def startParser(self):
# ...
self.main_thread = threading.currentThread()
self.start() # threading.Thread.start
# ...
#{ threading.Thread
def run(self):
self.work_thread = threading.currentThread()
assert self.work_thread is not self.main_thread
while True:
1/0
Отредактировано (Май 22, 2011 18:55:29)
Офлайн
пробую так:
def Start(self, event):
main = Parser()
for i in range(10):
main.setDaemon(True)
main.start()
time.sleep(1)
class Parser(threading.Thread):
RuntimeError: cannot set daemon status of active thread
Офлайн
InPythonНе могу понять зачем здесь range:RuntimeError: cannot set daemon status of active thread
Отредактировано (Май 23, 2011 10:41:50)
Офлайн
Спасибо ренж убрал, так работает. А как в таком случаи задать количество потоков?
Офлайн
Если следить за ними особо не нужно то можно внести
main = Parser() в цикл. Будет создано 10 потоков.
можно ThreadPool использовать:
http://evgenm.com/blog/2010/05/11/pul-potokov-thread-pull/
Офлайн
а можно пример кода?
Офлайн
def Start(self, event):
for i in range(10):
main = Parser()
main.setDaemon(True)
main.start()
time.sleep(1)
class Parser(threading.Thread):
def Start(self, event):
pool = [Parser() for i in xrange(10)]
for thread in pool:
thread.setDaemon(True)
thread.start()
class Parser(threading.Thread):
Офлайн
Спасибо большое за подробные примеры, оба варианта работают, работают без ошибок. Но приложение остается все равно однопоточным, это видно из времени выполнения и порядка записи в файл т.е. все писалось от начала и до конца одним потоком.
Офлайн
GIL?
Офлайн