2014-07-26 9 views
1

웹 페이지를 비동기 적으로 가져 오기 위해 요청을 사용했습니다. 그리고 내 컴퓨터는 멀티 코어를 사용하기 때문에 여러 웹 사이트를 동시에 가져오고 싶습니다. 동시 사용을 시도합니다. 미래도 있습니다. 미래 또한 비동기식 메소드를 제공합니다. concurrent.futures 'async와 requests-future'async 사이의 차이점이 같으면 요청 - 선물을 사용하지 않을 수 있음을 의미합니까?동시성의 비동기식과 요청 - 미래형의 비동기식의 차이점은 무엇입니까?

답변

4

requests-futuresconcurrent.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 모듈에서 제공하는 다른 메소드와 함께 사용하는 것이 좋습니다.

+0

Thx ~ 나는 또한 멀티 코어를 활용하고자하므로 concurrent.futures.ProcessPoolExecutor가 더 좋을 것으로 생각하십니까? – leafonsword

+0

@leafonsword'requests' 라이브러리를 사용하기 위해서는'ThreadPoolExecutor'를 사용하는 것이 좋습니다. HTTP 요청은 I/O 바인딩 작업이므로 대부분의 경우 GIL이 릴리스됩니다. CPU 바운드 작업을 동시에 수행하려고한다면 확실히 ProcessPoolExecutor를 사용하고 싶을 것입니다. – dano