@Kirill-Gorelov
С ума с IT

Python, как синхронизировать потоки threading?

Парни, пишу на питоне скрипт проверка существования ссылок на своем сайте.
Для теста даю ему пул ссылок и скрипт вроде как их проверят но выдает ошибки и не правильные ответы.
К примеру ссылка такая есть, а он пишет, что ее нету.
Так же выдает ошибку,что переменной еще нету.
UnboundLocalError: local variable 'code' referenced before assignment


Поискал решение - нужно синхронизировать потоки, но у меня не получается, выводит либо кучу ошибок, либо вообще не запускается. Маны не сильно помогли.
Кто-то может знает как синхронизировать потоки.
Прилагаю исходник изначального кода.
домен reactone-loc.ru это мой локальный домен.
При маленьком количестве ссылок, работает нормально, а вот если дать ему больше 100 ссылок, начинаются сильные тормоза(
import time
import requests
import threading
import urllib, socket, time
site_pages = ['http://reactone-loc.ru',
'http://reactone-loc.ru/hththt/mainscript.js',
'http://reactone-loc.ru',
'http://reactone-loc.ru/main/d36/d36af6d8a98e74738b4cb822f4a7e692/KdNC0w_7_zU2.jpg','http://example.com','http://example.com/page1','http://example.com/page5','http://example.com/page6','http://example.com/page7','http://example.com/page9','http://example.com/page10','http://ya.ru','http://yandex.ru','http://yanff.ru','http://ya1.ru','http://ya.com','http://ya.ru','http://ya.ru','http://ya.ru','http://ya.ru'];

failed_pages = [];

def generate_message ():
	n = len(failed_pages)
	list = ""
	if (n > 0):
		list = "404 errors: \r\n"
		for failed_link in failed_pages:
			list = "\r\n".join((list, failed_link))
	else:
		list = "All links are correct"
	return list

def check_pages (pages):
	try:
		# start_time_site = time.time()
		try:
			# print(pages)
			code = urllib.urlopen(pages).getcode()
			# print("--- %s seconds ---" % (time.time() - start_time_site))
		except IOError:
			failed_pages.append(pages)
			# print "Not open url: ", pages
			# print("--- %s seconds ---" % (time.time() - start_time_site))
		print (code)
		print "{0} - {1}".format(pages, code)
		if (code not in [200, 301]):
			failed_pages.append(pages)
	except socket.error, e:
		print "Ping Error: ", e

global_start_time = time.time()

threads = []
for pair in site_pages:
    threads.append(threading.Thread(target=check_pages, args=(pair,)))

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(generate_message())
print("--- %s seconds ---" % (time.time() - global_start_time))
  • Вопрос задан
  • 308 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bbkmzzzz
Использовать очереди queue.Queue()
Очередь синхронизированная. Принцип: добавляете ссылки в очередь, запускаете потоки (передаете им очереди заданий и и результатов), потоки берут задания из очереди, обрабатывают и кладут в другую очередь объект с результатом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы