Форум сайта python.su
20
Я имел ввиду одновременно. Наверное можно так
for thread in threads:
thread.join()
Отредактировано (Март 12, 2012 17:53:41)
Офлайн
0
В общем разобрался я, убрал из кода суп полностью, оставил только регулярки, теперь чувствуется что работают потоки…
# -*- coding: cp1251 -*-
import urllib, urlparse, re, Queue, threading, time
queue = Queue.Queue()
lock = threading.RLock()
threads_count = 15
url_start = "http://site.ru"
url_end = "sitemap.xml"
url = urlparse.urljoin(url_start, url_end)
print u"Ждите ..."
link = urllib.urlopen(url)
links = str(link.read())
k = 1
list = []
p1 = re.compile(r"<loc>(.*?)</loc>", re.S | re.I)
p2 = re.compile(r"<meta\sname=\"Keywords\"\scontent=\"(.*)\">\n<meta\sname", re.S | re.I)
def worker():
global queue
while 1:
try:
target = queue.get_nowait()
starting(target)
except Queue.Empty:
return
def starting(gg):
global k, p2
try:
link1 = urllib.urlopen(gg)
b = p2.findall(link1.read())
c = "".join(b).decode("cp1251")
link1.close()
print u"Спарсили ключевик № " + str(k)
finally:
lock.acquire()
f = open("file1.txt", "a")
f.write(c.encode("cp1251") + "\n")
lock.release()
k += 1
def main():
global p1
for i in p1.findall(links):
queue.put(i)
for _ in xrange(threads_count):
thread_ = threading.Thread(target=worker)
thread_.start()
link.close()
q = raw_input("Parse ? y/n: ")
if q == "y":
main()
else:
print "Okay ..."
raw_input("")
Отредактировано (Март 13, 2012 17:01:13)
Офлайн
33
Mozart
Без thread_.join() ваша программа работает неправильно ;)
Еще раз: напишите в последнем raw_input(“”) непустое сообщение и запустите скрипт - поймете зачем нужен join.
Офлайн
0
Чтобы не плодить темы, решил отпостить свой небольшой вопрос тут.
Имеется класс Qhtread.
В теле Run() запускается функция, которая создает несколько простых потоков (Thread).
Дело в том, что Qthread не дожидается их завершения. Просто запускает потоки и Run завершается (return), а простые потоки продолжают работу, пока не выполнят задачу…
Можно каким-нибудь методом ожидать завершения этих потоков?
Офлайн
20
Как сказал Lexander, нужно вызывать метод join() у потоков. В этом случае выполнение Qthread будет приостановлено до получения сигнала или смерти Thread.
Офлайн
0
Программа многопоточная. Каждый поток выполняет свою задачу. Если использовать join(), то новый поток не создастся и не будет параллельно работать, пока не завершится предыдущий.
Отредактировано (Март 15, 2012 07:07:54)
Офлайн
19
shs666ЛОЛШТО. Еще раз. Создать несколько потоков, запустить их. Потом вызвать join.
Программа многопоточная. Каждый поток выполняет свою задачу. Если использовать join(), то новый поток не создастся и не будет параллельно работать, пока не завершится предыдущий.
for thread in threads:
thread.join()
Офлайн
0
Спасибо помогло :)
На самом деле я неправильно использовал join.
Офлайн
0
Lexander, в общем я понял что при использовании join() следующий поток будет ждать завершения работы начатого первого потока неограниченное количество времени, если не указан таймаут. Да и по повду raw_input() - написал там пару символов, без join() они выпадают сразу, т.е. программа считается завершенной, но очередь висит и потоки продолжают работать, а вот с join() программа будет ждать завершения работы всех потоков …
Офлайн