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.Future
를 반환하는
concurrent.futures.ThreadPoolExecutor
을 사용할 때 당신
submit
그것에 작업. HTTP 요청을 처리하기 위해
requests-futures
에서 제공하는 API를 사용하는 것이 더 편리하면이를 고수하고 반환 된 객체를
concurrent.futures
모듈에서 제공하는 다른 메소드와 함께 사용하는 것이 좋습니다.
Thx ~ 나는 또한 멀티 코어를 활용하고자하므로 concurrent.futures.ProcessPoolExecutor가 더 좋을 것으로 생각하십니까? – leafonsword
@leafonsword'requests' 라이브러리를 사용하기 위해서는'ThreadPoolExecutor'를 사용하는 것이 좋습니다. HTTP 요청은 I/O 바인딩 작업이므로 대부분의 경우 GIL이 릴리스됩니다. CPU 바운드 작업을 동시에 수행하려고한다면 확실히 ProcessPoolExecutor를 사용하고 싶을 것입니다. – dano