Найти - Пользователи
Полная версия: Как организовать многопоточность через экземпляр класса?
Начало » Python для новичков » Как организовать многопоточность через экземпляр класса?
1 2
pill
InPython
Спасибо большое за подробные примеры, оба варианта работают, работают без ошибок. Но приложение остается все равно однопоточным, это видно из времени выполнения и порядка записи в файл т.е. все писалось от начала и до конца одним потоком.
http://docs.python.org/glossary.html#term-global-interpreter-lock
http://docs.python.org/library/multiprocessing.html
InPython
неа 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()
Сейчас читая книгу М. Лутца я уже дошел до части ООП, и хотелось бы перенести эту модель работы с потоками в класс. Всем спасибо за понимание и поддержку.
agalen
Очень похоже, что все потоки открывают на запись один файл, причем не в режиме добавления - в результате там будет вывод одного потока или вообще мусор.

А вот в последнем примере open вызывается до запуска потоков.
InPython
не совсем понятен смысл вашего поста, если вы запускали последний скрипт то посмотрите внимательно, что все работает как и должно: файл открыт для до записи, в него идет вывод каждого потока отдельно.
agalen
Замечание было к самому первому скрипту.
InPython
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()
ну почему только один поток работает? :(
bw
Как узнал?
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
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