concurrent.futures'之间的区别是什么?异步和请求 - 期货' python中的异步?

时间:2014-07-26 03:04:16

标签: python asynchronous concurrency concurrent.futures

我使用requests-futures来异步抓取网页。我的机器有多核,所以我也想同时抓住很多网站,然后我尝试使用concurrent.futures,似乎concurrent.futures也提供了异步方法,所以concurrent.futures的async和requests-futures'async之间有什么区别?如果它们相同,意味着我可以弃用请求期货吗?

1 个答案:

答案 0 :(得分:4)

requests-futures只是concurrent.futures之上的一个非常小的包装器。您可以通过查看source code(为了简洁而删除了文档字符串)来看到这一点:

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会返回requests-futures。如果您使用concurrent.futures提供的API处理HTTP请求更方便,可以坚持使用它,甚至可以使用提供的其他方法使用它返回的对象由{{1}}模块。