Python 3 скоростной многопоточный парсер. Возможно?

Discussion in 'PHP' started by vladart, 23 Jul 2011.

  1. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Всем привет!

    С питоном разбираюсь недавно, в гугле нашел различные варианты многопоточных парсеров.
    Допиливал, но на высокой скорости их заставить работать так и не получается. При увеличении числа потоков или скорость не увеличивается, или начинают заклиниваться. Тестирую на VDS 1 Gb RAM

    Возможно ли на такой конфигурации добиться работы в 1000 - 2000 потоков например?

    Возможно ли вообще на 3-м Питоне добиться такой скорости?

    Готов купить/заказать скоростное решение на 3-м Питоне.
     
  2. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    С потоками ты ничего путного не сделаешь. По нормальному такие вещи делают на асинхронном i/o, и эта задача требует серьезного проектирования. Здесь тебе такого не родят, ищи программиста (а не кодера) на серьезном форуме.
     
  3. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Мысль понял, спасибо!

    Получается что потоки в Питоне это ерунда?

    Какой примерно скорости можно добиться на потоках? Подскажите плз примерные цифры из опыта.
     
  4. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Типа того, почитай http://habrahabr.ru/blogs/python/84629/

    Если очень хочется решить простым путем, при помощи потоков, то можно сделать так - 30 процессов python, в каждом по 30 потоков. Для работы с процессами есть модуль multiprocessing (позволяет обмениваться данными между процессами), но он скорее всего работает только в unix-like. В случае венды наверное придется городить обмен самому (если он вообще нужен) и запускать 30 питонов руками.

    Еще можно использовать curl multi (возможно еще в нескольких процессах), если запросы идут на разные сайты, неплохо бы собрать его с c-ares, чтобы днс-запросы были неблокирующими. Но с curl multi возникают проблемы с сохранением результата запроса. Если сохранение идет в файл (средствами самого curl), то можно надеяться на то, что он пишет в файл асинхронно. Но если нужно писать в базу, то это заблокирует его (curl'а) цикл обработки запросов на время запроса к базе.
     
    #4 ЕгоАкк, 24 Jul 2011
    Last edited: 24 Jul 2011
  5. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Если тебе важен результат, а не ЯП, то я могу предложить многопоточный вариант на PHP, будет работать очень быстро. Реализация через мультикурл.
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    А ты в курсе, что при таком количестве потоков у тебя все время процессорное уйдет на переключение контекстов этих самых потоков? Если речь идет о парсере данных, которые лежат на диске, то вообще не имеет смысла количество потоков делать больше, чем количество ядер процессора. А если о парсере данных, которые получаются из сети, то проще опять-таки реализовать асинхронный код скачивания, а потом разбить его на потоки по количеству ядер.
     
  7. emmy

    emmy Member

    Joined:
    12 Oct 2009
    Messages:
    76
    Likes Received:
    17
    Reputations:
    8
    А в PHP нет многопоточности. Мультикурл это и есть AIO
     
  8. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    А я где-то сказал что в пхп есть многопоточность?
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Конечно. AIO != мультитрединг.
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    vladart
    скорости чего? Скачивания? Можно равной скорости канала.

    ЕгоАкк из предложенной вами статьи - люди обычно делают неправильные выводы. Рекомендую несколько более точный разбор GIL тут - http://asvetlov.blogspot.com/2011/07/gil.html
     
    _________________________
  11. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    егоАкк спасибо, почитаю про multiprocessing (тестирую на centos).

    |qbz| Главное результат. Можно и на PHP. Если это реально сделать на PHP - multicurl, готов обсудить. Сам пробовал на multicurl, 30 потоков работают нормально, остальные не стабильно. (VDS,Centos, Nginx, 1Gb RAM)

    Придумал бредовое решение. Настраиваю скрипт на парсинг, копирую его например в 1000 папок, из другого главного скрипта + раскидываю задания на эти 1000 скриптов и по крону или nohup запускаю 1000 скриптов. Затем главным скриптом собираю результат, обрабатываю и при необходимости раскидываю новые задания. Кто-нибудь городил такой огород? Знаю что бред, но работать должно как надо и конфликтовать между собой не будет, у каждого скрипта свои задания.
     
  12. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    само собой, VDS для теста. Но вот только потенциал VDS гораздо больше, чем даже 100 потоков.
     
  13. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Не слушай этого жёлтенького хyя. ВДС нормальный, нужна лишь правильная реализация. А хеккеры только и могут давать советы типа - купи мясорубку помощнее, авось перемелется. Поискать нормального исполнителя можно на python.su, linux.org.ru.
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    ЕгоАкк вас троллят. И к слову - всегда найдется весь такой не мейнстримовый чувак, выступающий против всех. "Здесь не торт - иди туда"

    vladart учите язык, ваша проблема не в питоне и не в железе, а в незнании языка.
     
    _________________________
  15. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Если б знал Питон - вопросов бы не задавал.
     
  16. Светлый

    Светлый Elder - Старейшина

    Joined:
    28 Jun 2007
    Messages:
    159
    Likes Received:
    47
    Reputations:
    46
    возможно и больше, своими глазами сейчас наблюдаю живой пример на своём VDS. RAM скушан весь, загрузка проца в среднем 5%. 2000 потоков
     
  17. D1mka

    D1mka Elder - Старейшина

    Joined:
    2 Jan 2008
    Messages:
    123
    Likes Received:
    14
    Reputations:
    2
    не адекват? и это на тройке с кривым джилом?
    Вот вроде под пхпбб писал парсер, советую поэкспериментировать с количеством потоков.
    PHP:
    # -*- coding: utf-8 -*-
    import urllibretimethreadingsys
    from Queue import Queue
    queue 
    Queue()
    start time.time()
    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(patternurl)
              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(020050):
        
    queue.put('http://phpbb/forum/memberlist.php?start='+str(count))
    threads = []
    for 
    x in xrange(10):
        
    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к потоков.
     
    #17 D1mka, 28 Jul 2011
    Last edited: 28 Jul 2011
  18. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    D1mka, тестировать не буду, это код не для 3 Питона.
    Хотя мои тесты примерно такие же были через Queue.

    Сколько получается максимум выжать?

    Светлый, отправил в личку сообщений
     
  19. D1mka

    D1mka Elder - Старейшина

    Joined:
    2 Jan 2008
    Messages:
    123
    Likes Received:
    14
    Reputations:
    2
    www.vbulletin.com/forum/forum.php -парсинг за минимальное время был при 15 потоках, брут при 5. Больше 50-ти потоков становились вообще не управляемые, больше 100 -зависал скрипт (в убунте и виндовсе)
    p.s. да это мой кросс-пост.
     
  20. vladart

    vladart New Member

    Joined:
    8 Oct 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    У меня на 20 потоках заметно быстрее чем на одном, а при увеличении числа потоков - скорость уже не растет.

    надо вникать в multiprocessing