我用requests-futures异步抓取网页,而且我的机器是多核的,所以我也想同时抓取很多网站,然后我尝试使用concurrent.futures,好像concurrent.futures也提供了异步的方法,所以有什么区别concurrent.futures 的异步和 requests-futures 的异步之间?如果它们相同,意味着我可以弃用 requests-futures?
问问题
1778 次
1 回答
5
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
会返回 a 。如果你使用 提供的处理 HTTP 请求的 API 更方便,可以坚持使用它,甚至可以将它返回的对象与模块提供的其他方法一起使用。concurrent.futures.Future
submit
requests-futures
concurrent.futures
于 2014-07-26T03:31:32.680 回答