Python запросы с многопоточностью

Последние два дня я пытался создать скребок с поддержкой многопоточности. Каким-то образом я все еще не мог справиться с этим. Сначала я попробовал обычный многопоточный подход с модулем потоков, но это было не быстрее, чем использование одного потока. Позже я узнал, что запросы блокируют, а многопоточный подход на самом деле не работает. Так что я продолжал исследовать и узнавал о гречах и гентах. Сейчас я запускаю тесты с Gevent, и это все еще не быстрее, чем использование одного потока. Мое кодирование неверно?

Вот соответствующая часть моего класса:

import gevent.monkey
from gevent.pool import Pool
import requests

gevent.monkey.patch_all()

class Test:
    def __init__(self):
        self.session = requests.Session()
        self.pool = Pool(20)
        self.urls = [...urls...]

    def fetch(self, url):

        try:
            response = self.session.get(url, headers=self.headers)
        except:
            self.logger.error('Problem: ', id, exc_info=True)

        self.doSomething(response)

    def async(self):
        for url in self.urls:
            self.pool.spawn( self.fetch, url )

        self.pool.join()

test = Test()
test.async()
 Will09 июл. 2016 г., 11:39
Ты прав!grequests это новый путь; смотри мой ответ.
 krypt09 июл. 2016 г., 11:14
Я добавил импорт. Извините, я не думал, что это будет необходимо. Я не пробовал многопроцессорность, но почему бы не работать Gevent?
 krypt09 июл. 2016 г., 11:27
Кажется, это больше не поддерживается. ValueError: gevent.httplib больше не предоставляется, httplib должен быть False
 Will09 июл. 2016 г., 11:04
Где ваш импорт? Также вы пробовалиmultiprocessing модуль?
 krypt09 июл. 2016 г., 11:42
@ user4815162342 Вы можете быть правы, так как я не очень хорошо осведомлен в этих темах. Я предполагал это, потому что я не видел улучшений в скорости при многопоточности по сравнению с одним подходом процесса.
 user481516234209 июл. 2016 г., 11:39
Я бы поставил под сомнение ваше предположение, что «запросы блокируют, а многопоточный подход на самом деле не работает». Хотя запросы действительно блокируются, они блокируют только поток, в котором они выполняются. (GIL Python здесь не представляет проблемы, потому что он внутренне выпускается при блокировке сетевых вызовов, относящихся кrequests.) Не должно быть проблем с запускомrequests в несколько потоков.
 Will09 июл. 2016 г., 11:21
Нет проблем! Попробуйте изменитьgevent.monkey.patch_all() вgevent.monkey.patch_all(httplib=True), Если это поможет, я объясню это.

Ответы на вопрос(0)

Ваш ответ на вопрос