Найти - Пользователи
Полная версия: Как организовать многопоточность через экземпляр класса?
Начало » Python для новичков » Как организовать многопоточность через экземпляр класса?
1 2
InPython
т.е. с потоками я работать могу, просто сейчас когда решил использовать классы не совсем понятна логика работы в именно классе. Пожалуйста подскажите как правильно это реализовать.
# -*- 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')

"""Как сюда прикрутить потоки"""
bw
Не понял в чём проблема.
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
..bw
InPython
пробую так:
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
как можно избежать этой ошибки?
pill
InPython
RuntimeError: cannot set daemon status of active thread
Не могу понять зачем здесь range:
Вы десять раз пытаетесь демонизировать и стартовать один и тот-же поток. Естественно Питон ругается.
InPython
Спасибо ренж убрал, так работает. А как в таком случаи задать количество потоков?
pill
Если следить за ними особо не нужно то можно внести
main = Parser() в цикл. Будет создано 10 потоков.

можно ThreadPool использовать:
http://evgenm.com/blog/2010/05/11/pul-potokov-thread-pull/
InPython
а можно пример кода?
pill
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):
Принципиально это ничего не меняет, но так за потоками присматривать можно…
InPython
Спасибо большое за подробные примеры, оба варианта работают, работают без ошибок. Но приложение остается все равно однопоточным, это видно из времени выполнения и порядка записи в файл т.е. все писалось от начала и до конца одним потоком.
Андрей Светлов
GIL?
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