Python 2.5 - многопоточный цикл - PullRequest
4 голосов
/ 29 марта 2012

У меня есть кусок кода:

for url in get_lines(file):
    visit(url, timeout=timeout)

Он получает URL-адреса из файла и просматривает его (по urllib2 ) в цикле for.

Возможно ли сделать это в несколько потоков? Например, 10 посещений одновременно.


Я пробовал:

for url in get_lines(file):
    Thread(target=visit, args=(url,), kwargs={"timeout": timeout}).start()

Но это не работает - безрезультатно, URL посещаются нормально.


Упрощенная версия функции визит :

def visit(url, proxy_addr=None, timeout=30):
    (...)
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    return response.read()

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Чтобы расширить ответ отправителя, вы можете использовать класс Pool в многопроцессорной обработке, чтобы сделать это легко:

from multiprocessing import Pool
pool = Pool(processes=5)
pages = pool.map(visit, get_lines(file))

Когда функция карты вернется, «страницы» будут списком содержимого URL. Вы можете настроить количество процессов так, как вам удобно.

1 голос
/ 29 марта 2012

Я подозреваю, что вы столкнулись с Global Interpreter Lock . По сути, threading в python не может достичь параллелизма, что, по-видимому, и является вашей целью. Вам нужно использовать multiprocessing.

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

В multiprocessing класс Process является эквивалентом класса Thread в threading. У него все те же методы, поэтому в данном случае это замена. (Хотя я полагаю, что вы могли бы использовать pool, как подсказывает JoeZuntz - но я бы сначала проверил с базовым классом Process, чтобы посмотреть, решит ли он проблему.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...