Всем привет! С питоном разбираюсь недавно, в гугле нашел различные варианты многопоточных парсеров. Допиливал, но на высокой скорости их заставить работать так и не получается. При увеличении числа потоков или скорость не увеличивается, или начинают заклиниваться. Тестирую на VDS 1 Gb RAM Возможно ли на такой конфигурации добиться работы в 1000 - 2000 потоков например? Возможно ли вообще на 3-м Питоне добиться такой скорости? Готов купить/заказать скоростное решение на 3-м Питоне.
С потоками ты ничего путного не сделаешь. По нормальному такие вещи делают на асинхронном i/o, и эта задача требует серьезного проектирования. Здесь тебе такого не родят, ищи программиста (а не кодера) на серьезном форуме.
Мысль понял, спасибо! Получается что потоки в Питоне это ерунда? Какой примерно скорости можно добиться на потоках? Подскажите плз примерные цифры из опыта.
Типа того, почитай http://habrahabr.ru/blogs/python/84629/ Если очень хочется решить простым путем, при помощи потоков, то можно сделать так - 30 процессов python, в каждом по 30 потоков. Для работы с процессами есть модуль multiprocessing (позволяет обмениваться данными между процессами), но он скорее всего работает только в unix-like. В случае венды наверное придется городить обмен самому (если он вообще нужен) и запускать 30 питонов руками. Еще можно использовать curl multi (возможно еще в нескольких процессах), если запросы идут на разные сайты, неплохо бы собрать его с c-ares, чтобы днс-запросы были неблокирующими. Но с curl multi возникают проблемы с сохранением результата запроса. Если сохранение идет в файл (средствами самого curl), то можно надеяться на то, что он пишет в файл асинхронно. Но если нужно писать в базу, то это заблокирует его (curl'а) цикл обработки запросов на время запроса к базе.
Если тебе важен результат, а не ЯП, то я могу предложить многопоточный вариант на PHP, будет работать очень быстро. Реализация через мультикурл.
А ты в курсе, что при таком количестве потоков у тебя все время процессорное уйдет на переключение контекстов этих самых потоков? Если речь идет о парсере данных, которые лежат на диске, то вообще не имеет смысла количество потоков делать больше, чем количество ядер процессора. А если о парсере данных, которые получаются из сети, то проще опять-таки реализовать асинхронный код скачивания, а потом разбить его на потоки по количеству ядер.
vladart скорости чего? Скачивания? Можно равной скорости канала. ЕгоАкк из предложенной вами статьи - люди обычно делают неправильные выводы. Рекомендую несколько более точный разбор GIL тут - http://asvetlov.blogspot.com/2011/07/gil.html
егоАкк спасибо, почитаю про multiprocessing (тестирую на centos). |qbz| Главное результат. Можно и на PHP. Если это реально сделать на PHP - multicurl, готов обсудить. Сам пробовал на multicurl, 30 потоков работают нормально, остальные не стабильно. (VDS,Centos, Nginx, 1Gb RAM) Придумал бредовое решение. Настраиваю скрипт на парсинг, копирую его например в 1000 папок, из другого главного скрипта + раскидываю задания на эти 1000 скриптов и по крону или nohup запускаю 1000 скриптов. Затем главным скриптом собираю результат, обрабатываю и при необходимости раскидываю новые задания. Кто-нибудь городил такой огород? Знаю что бред, но работать должно как надо и конфликтовать между собой не будет, у каждого скрипта свои задания.
Не слушай этого жёлтенького хyя. ВДС нормальный, нужна лишь правильная реализация. А хеккеры только и могут давать советы типа - купи мясорубку помощнее, авось перемелется. Поискать нормального исполнителя можно на python.su, linux.org.ru.
ЕгоАкк вас троллят. И к слову - всегда найдется весь такой не мейнстримовый чувак, выступающий против всех. "Здесь не торт - иди туда" vladart учите язык, ваша проблема не в питоне и не в железе, а в незнании языка.
возможно и больше, своими глазами сейчас наблюдаю живой пример на своём VDS. RAM скушан весь, загрузка проца в среднем 5%. 2000 потоков
не адекват? и это на тройке с кривым джилом? Вот вроде под пхпбб писал парсер, советую поэкспериментировать с количеством потоков. PHP: # -*- coding: utf-8 -*- import urllib, re, time, threading, sys from Queue import Queue queue = Queue() start = time.time() f = open("user_th10.txt", "w+") f.write("Время : %s" % (time.time())+'\n') def Main(): while True: if queue.empty(): return site = queue.get_nowait() url = urllib.urlopen(site).read() pattern = r'class=\"gen\">([^<]+)</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(0, 200, 50): queue.put('http://phpbb/forum/memberlist.php?start='+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') time.sleep(5) f.write('Количество собраных логинов: %s' % (len(open("user_th10.txt", 'r').readlines()))) f.close() кстати, может кто то лучше вариант предложит? только не нужно писать бред про 2-3к потоков.
D1mka, тестировать не буду, это код не для 3 Питона. Хотя мои тесты примерно такие же были через Queue. Сколько получается максимум выжать? Светлый, отправил в личку сообщений
www.vbulletin.com/forum/forum.php -парсинг за минимальное время был при 15 потоках, брут при 5. Больше 50-ти потоков становились вообще не управляемые, больше 100 -зависал скрипт (в убунте и виндовсе) p.s. да это мой кросс-пост.
У меня на 20 потоках заметно быстрее чем на одном, а при увеличении числа потоков - скорость уже не растет. надо вникать в multiprocessing