Форум сайта python.su
Друзья, всем привет!
Очень нужен совет по теме ниже, с радостью заплачу 500 WMR первому кто укажет работающий код.
Суть проблемы - нужно максимально ускорить выполнение скрипта, который обходит веб-адреса по списку “domains.txt”, указывая при этом в качестве ссылающегося адреса (referer) один определенный домен. Я написал скрипт который это делает последовательно, обходя домены один за другим, теперь мне нужно многократно ускорить работу этого скрипта. Это можно сделать за счет параллельного выполнения нескольких запросов, чем больше параллельных запросов - тем лучше. По запросу “python multithreading url” google выдает кучу разных решений, но ни один из них к сожалению у меня не заработал, видимо руки из ж… растут Вот например несколько примеров:
http://chriskiehl.com/article/parallelism-in-one-line/
https://mellowd.co.uk/ccie/?tag=multi-threading
http://stackoverflow.com/questions/16181121/python-very-simple-multithreading-parallel-url-fetching-without-queue
Мой скрипт указан ниже, он выполняется минут за 5, мне нужно максимально ускорить его работу, я предполагаю что путем распараллеливания задач можно ускорить работу минимум в 5-10 раз. (предполагаем что комп и Интернет - мощные и не вносят задержек)
import urllib2 my_ref = "http://sun-charge.com/" #zdes budem moi domen, drugoi with open("domains.txt", "r") as f: urls = f.readlines() for url in urls: url = url.strip() url = "http://" + url try: opener = urllib2.build_opener() opener.addheaders = [('Referer', my_ref)] #dlya proverki mozhno pomenyat mestami "url" i "my_ref" opener.open(url) #dlya proverki mozhno pomenyat mestami "url" i "my_ref" print "done" except: print "Unable to download"
Прикреплённый файлы: domains.txt (118,1 KБ)
Офлайн
Надо просто загрузить в queue.Queue() ссылки и запустить множество потоков, читающих с неё.
russian_bearЭто всё не то. Вот пример.
http://chriskiehl.com/article/parallelism-in-one-line/
https://mellowd.co.uk/ccie/?tag=multi-threading
http://stackoverflow.com/questions/16181121/python-very-simple-multithreading-parallel-url-fetching-without-queue
Отредактировано py.user.next (Июль 5, 2015 03:27:06)
Офлайн
py.user.nextК сожалению у меня не хватает опыта(и ума?) переписать скрипт самостоятельно, использую пример с “Queue” . Буду бесконечно благодарен(и 500 WMR) любому кто даст готовый работающий вариант.
Надо просто загрузить в queue.Queue() ссылки и запустить множество потоков, читающих с неё.
Офлайн
Как то так
import urllib2 from queue import Queue from threading import Thread MY_REF = "http://sun-charge.com/" NUM_THREADS = 8 def chech_url(queue): while True: url = queue.get() try: opener = urllib2.build_opener() opener.addheaders = [('Referer', MY_REF)] opener.open(url) print("done") except Exception as e: print("Unable to download", e) queue.task_done() check_queue = Queue() with open("/home/pooh/domains.txt", "r") as f: for url in f: check_queue.put("http://{0}".format(url.strip())) for i in range(NUM_THREADS): worker = Thread(target=chech_url, args=(check_queue,)) worker.setDaemon(True) worker.start() check_queue.join()
Отредактировано PooH (Июль 5, 2015 10:20:09)
Офлайн
PooHДорогой PooH,
Как то так
Офлайн
кстати помогает если вообще закомментировать(или стереть) строчку “worker.setDaemon(True)”, скрипт НАЧИНАЕТ исполняться, но через несколько секунд подвисает и останавливается в выполнении(без ошибки), визуально как если-бы задание (thread) встало в очередь а она остановилась из-за ожидания ответа получения урл
Офлайн
Сдался Вам этот urllib ? Вот можете попробовать. Поэкспериментируйте со значением timeout.
import requests from multiprocessing.dummy import Pool import time ref = 'http://sun-charge.com/' def get_url(url): try: requests.get('http://%s' % url.rstrip(), timeout=1, headers={'referer': ref}) print('done') except Exception as e: print(e) domains = open('/home/ayb/Загрузки/domains.txt', 'r').readlines() pool = Pool(200) pool.map(get_url, domains)
Офлайн
aybСпасибо, дружище !!! То что надо ! респект и уважуха. Напиши пожалуйста номер WMR кошелька.(можно в ЛС)
Сдался Вам этот urllib ? Вот можете попробовать. Поэкспериментируйте со значением timeout.
Офлайн