2014-07-26 34 views

回答

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提供的API來處理HTTP請求,可以堅持使用它,甚至可以使用由concurrent.futures模塊提供的其他方法返回的對象。

+0

Thx〜我也想利用多核心,所以concurrent.futures.ProcessPoolExecutor似乎更好? – leafonsword

+0

@leafonsword那麼,對於使用'requests'庫,你可能可以使用'ThreadPoolExecutor'; HTTP請求是I/O綁定操作,這意味着GIL將在大部分時間被釋放。如果你也試圖同時執行CPU綁定操作,那麼一定要使用'ProcessPoolExecutor'。 – dano

相關問題