Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2011 18:19:29

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

т.е. с потоками я работать могу, просто сейчас когда решил использовать классы не совсем понятна логика работы в именно классе. Пожалуйста подскажите как правильно это реализовать.

# -*- 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')

"""Как сюда прикрутить потоки"""



Офлайн

#2 Май 22, 2011 18:52:45

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как организовать многопоточность через экземпляр класса?

Не понял в чём проблема.

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



Отредактировано (Май 22, 2011 18:55:29)

Офлайн

#3 Май 23, 2011 09:44:06

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

пробую так:

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
как можно избежать этой ошибки?



Офлайн

#4 Май 23, 2011 10:40:49

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

InPython
RuntimeError: cannot set daemon status of active thread
Не могу понять зачем здесь range:
Вы десять раз пытаетесь демонизировать и стартовать один и тот-же поток. Естественно Питон ругается.



Отредактировано (Май 23, 2011 10:41:50)

Офлайн

#5 Май 23, 2011 11:00:20

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

Спасибо ренж убрал, так работает. А как в таком случаи задать количество потоков?



Офлайн

#6 Май 23, 2011 12:17:08

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

Если следить за ними особо не нужно то можно внести
main = Parser() в цикл. Будет создано 10 потоков.

можно ThreadPool использовать:
http://evgenm.com/blog/2010/05/11/pul-potokov-thread-pull/



Офлайн

#7 Май 23, 2011 13:04:07

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

а можно пример кода?



Офлайн

#8 Май 23, 2011 14:22:29

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

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):
Принципиально это ничего не меняет, но так за потоками присматривать можно…



Офлайн

#9 Май 23, 2011 19:41:02

InPython
От:
Зарегистрирован: 2011-01-31
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Как организовать многопоточность через экземпляр класса?

Спасибо большое за подробные примеры, оба варианта работают, работают без ошибок. Но приложение остается все равно однопоточным, это видно из времени выполнения и порядка записи в файл т.е. все писалось от начала и до конца одним потоком.



Офлайн

#10 Май 23, 2011 21:49:57

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

Как организовать многопоточность через экземпляр класса?

GIL?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version