Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2011 09:17:22

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

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

InPython
Спасибо большое за подробные примеры, оба варианта работают, работают без ошибок. Но приложение остается все равно однопоточным, это видно из времени выполнения и порядка записи в файл т.е. все писалось от начала и до конца одним потоком.
http://docs.python.org/glossary.html#term-global-interpreter-lock
http://docs.python.org/library/multiprocessing.html



Офлайн

#2 Май 24, 2011 09:28:51

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

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

неа GIL я пока использовать не планирую. Андрей, в предыдущей теме вы показали отличный пример для работы с многопоточным приложением, где это видно по времени выполнения скрипта и рандомной записи в файл.

# -*- coding: utf-8 -*-
import urllib, re, time, threading
from Queue import Queue
queue = Queue()
start = time.time()
f = open("user_th10.txt", "w+")
def Main():
while True:
if queue.empty():
return
site = queue.get_nowait()
url = urllib.urlopen(site).read()
pattern = r'profile.php\?id=\d+\">([^<]+)</a>'
users = re.compile(pattern)
users = re.findall(pattern, url)
if len(users) == 0:
break
for user in users:
f.write(user.decode('windows-1251').encode('utf-8')+'\n')
print user

for count in range(1, 15, 1):
queue.put('http://python.su/forum/userlist.php?username=&show_group=-1&sort_by=username&sort_dir=ASC&p='+str(count))
threads = []
for x in xrange(10):
t = threading.Thread(target = Main)
threads.append(t)
t.start()
for t in threads:
t.join()
f.write("Времени затрачено: %s" % (time.time() - start)+'\n')
f.close()
Сейчас читая книгу М. Лутца я уже дошел до части ООП, и хотелось бы перенести эту модель работы с потоками в класс. Всем спасибо за понимание и поддержку.



Отредактировано (Май 24, 2011 09:29:24)

Офлайн

#3 Май 24, 2011 09:46:30

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

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

Очень похоже, что все потоки открывают на запись один файл, причем не в режиме добавления - в результате там будет вывод одного потока или вообще мусор.

А вот в последнем примере open вызывается до запуска потоков.



Отредактировано (Май 24, 2011 09:52:34)

Офлайн

#4 Май 24, 2011 10:31:39

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

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

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



Офлайн

#5 Май 24, 2011 14:05:50

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

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

Замечание было к самому первому скрипту.



Офлайн

#6 Май 27, 2011 21:06:22

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

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

class Parser:
def __init__(self, ):
self.queue = Queue()
self.t = threading.Thread()
self.start_time = time.time()
self.fileopen = filename

def start_p(self, fileopen):
while True:
if self.queue.empty():
return
site = self.queue.get_nowait()
url_site = urllib.urlopen(site).read()
pattern = r'class=\"gen\">([^<]+)</a>'
users = re.compile(pattern)
users = re.findall(pattern, url_site)
with open(fileopen, 'a') as f:
for user in users:
f.write(user.decode('windows-1251').encode('utf-8')+'\n')
print user
self.queue.task_done()
def parser(self, url):
for count in range(0, 1000, 50):
self.queue.put(url+'memberlist.php?start='+str(count))
threads = []
for x in xrange(25):
self.t = threading.Thread(target = self.start_p(self.fileopen))
threads.append(self.t)
self.t.start()
for self.t in threads:
self.t.join()
ну почему только один поток работает? :(



Офлайн

#7 Май 28, 2011 15:06:15

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

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

Как узнал?
GIL?

Объясни мне гон про self.t:
1. self.t = threading.Thread()
2. self.t = threading.Thread…
3. threads.append(self.t)
4. self.t.start()
5. for self.t in threads…
6. self.t.join()

1. Зачем ты его при инициализации Parser определяешь, хотя не используешь затем?
2. Зачем он вообще в пространстве экземпляра класса Parser?

..bw



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version