В чем разница между асинхронностью concurrent.futures и асинхронностью запросов-фьючерсов в python?

Я использовал запрос-фьючерс для асинхронного захвата веб-страницы. И на моей машине многоядерность, поэтому я также хочу захватить много веб-сайтов одновременно, затем я пытаюсь использовать concurrent.futures, кажется, что concurrent.futures также предоставляют асинхронный метод, так в чем же разница? между асинхронными асинхронными и запросами-фьючерсами concurrent.futures? Если они совпадают, значит, я мог бы отказаться от запросов-фьючерсов?

1 ответ

Решение

requests-futures это просто очень маленькая оболочка сверху concurrent.futures, Вы можете увидеть это, посмотрев на исходный код (для краткости удалены строки документации):

from concurrent.futures import ThreadPoolExecutor
from requests import Session
from requests.adapters import DEFAULT_POOLSIZE, HTTPAdapter

class FuturesSession(Session):

    def __init__(self, executor=None, max_workers=2, *args, **kwargs):
        super(FuturesSession, self).__init__(*args, **kwargs)
        if executor is None:
            executor = ThreadPoolExecutor(max_workers=max_workers)
            # set connection pool size equal to max_workers if needed
            if max_workers > DEFAULT_POOLSIZE:
                adapter_kwargs = dict(pool_connections=max_workers,
                                      pool_maxsize=max_workers)
                self.mount('https://', HTTPAdapter(**adapter_kwargs))
                self.mount('http://', HTTPAdapter(**adapter_kwargs))

        self.executor = executor

    def request(self, *args, **kwargs):
        func = sup = super(FuturesSession, self).request

        background_callback = kwargs.pop('background_callback', None)
        if background_callback:
            def wrap(*args_, **kwargs_):
                resp = sup(*args_, **kwargs_)
                background_callback(self, resp)
                return resp

            func = wrap

        return self.executor.submit(func, *args, **kwargs) # This returns a concurrent.futures.Future

Когда вы используете requests-futuresвы действительно используете concurrent.futures.ThreadPoolExecutor, который возвращает concurrent.futures.Future когда ты submit задача к этому. Если вам удобнее использовать API, предоставленный requests-futures для работы с HTTP-запросами можно придерживаться его и даже использовать возвращаемые им объекты с другими методами, предоставленными concurrent.futures модуль.

Другие вопросы по тегам