Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 21, 2012 14:57:44

looser14
Зарегистрирован: 2012-06-21
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточное приложение, загружающее содержимое сайтов

Добрый день.
Есть следующий код:

import urllib2
proxies = {'http':'200.206.14.26:3128'}
proxySupport =  urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxySupport)
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
urllib2.install_opener(opener)
count = 0
linecount = 0
with open("list.txt", "r") as f1:
    for line in f1.readlines():
        linecount+=1
        print line
        f = urllib2.urlopen(line)
        s = f.read()
        result = s.find('<h1 id="title"><b id="profile'\
                            '_online_lv" class="fl_r">Online')
        if result != -1:
            print 'yes'
            count += 1
            
        f.close()
        sleep(50)
with open("result.txt", "w") as f1:
    f1.write("Из %d человек %d онлайн" % (linecount, count))
Я хочу заключить его в метод класса:
import threading
class VKThread(threading.Thread):
    def run(self):
    # код выше
for x in xrange (20):
    VKThread().start()

В принципе, с помощью глобальных переменных внутри класса я могу сделать так, чтобы на каждый поток использовался отдельный прокси.

У меня вопрос, как узнать, свободен ли поток и в зависимости от этого использовать его, чтобы обработать следующую строку из файла?
Я бы сделал так:
Организовал бесконечный цикл. Объявил бы список threadFree, элементы которого были бы равны 0 или 1 (изначально все 0). Если поток начинает выполнение, то threadFree = 1, а когда код потока завершится, то присвоить 0. В бесконечном цикле выявляется, какой поток свободен и если есть какой-нибудь свободный, то создать новый. Так до тех пор, пока не закончатся строки в файле, точнее пока не будет обработана последняя строка. Но тут проблема, во-первых, в коде берётся какой-то номер строки. Если будет одновременное выполнение нескольких процессов, то возникнет путаница, ведь неясно, какую строку брать. Например, берётся первая строка в первом потоке. Значит, следующей будет 2 строка и мы увеличиваем значение спец. переменной на 1…. в общем, я даже объяснить не могу толком.
Дайте каких-нибудь советов, спасибо. Правильно ли я рассуждаю вообще?

Отредактировано looser14 (Июнь 21, 2012 15:08:31)

Офлайн

#2 Июнь 21, 2012 15:43:23

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Многопоточное приложение, загружающее содержимое сайтов

Обычно задачи производитель-потребитель реализуются с помощью очереди. У вас есть поток-производитель, который читает из файла и складывает строки в очередь. И есть потоки-потребители, которые вычитывают сообщения из очереди и складывают куда-то результат.



Офлайн

#3 Июнь 21, 2012 17:30:47

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Многопоточное приложение, загружающее содержимое сайтов

Зависит от количества заданий, если они вмещаются в оперативную память, можно в начале поместить их все в Queue, затем запустить несколько тредов, которые будут брать задания из Queue. Если заданий слишком много или они возникают во время работы, то нужен допонительный поток, который будет помещать эти задания в Qeueue, также надо будет определиться о том, как рабочие потоки узнают, что заданий больше нет (например Queue может быть пуста, но поток производитель заданий добавит в ней задания через некоторое время).

Можно попробовать использовать multiprocessing вместо thrading - это повысит произвиодительность.

Вот пример класса, который облегчает использование пула потоков т.е. он позволяет выполнить N задач используя M тредов: https://bitbucket.org/lorien/grab/src/04707b1274e7/grab/tools/work.py

А вот его реализация на базе multiprocessing (но я её толком не тестировал): https://bitbucket.org/lorien/grab/src/04707b1274e7/grab/tools/pwork.py

Также можно вообще поглядеть в сторону асинхронного подхода. Есть удобные фреймворки для организации асинхронных парсеров: Grab:Spider и Scrapy

Офлайн

#4 Июнь 22, 2012 20:42:11

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Многопоточное приложение, загружающее содержимое сайтов

Вот тут мы нечто подобное обсуждали: http://python.su/forum/topic/9423/
Там и код есть, если дочитаете до него :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version