我用requests-futures來異步抓取網頁,而且我的機器有多核,所以我也想同時抓多個網站,然後我試着用concurrent.futures,看來concurrent.futures也提供異步方法,所以什麼是concurrent.futures'async和request-futures'異步之間的區別?如果它們相同,意味着我可以反對請求 - 期貨?python中concurrent.futures的async和requests-futures異步有什麼區別?
1
A
回答
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
模塊提供的其他方法返回的對象。
相關問題
- 1. 同步請求和異步請求之間有什麼區別? (async = true/false)
- 2. 異步私有和私有異步的區別是什麼?
- 3. pubsubhubbub - 同步和異步在訂閱Feed時有什麼區別?
- 4. python中的{}和[]有什麼區別?
- 5. 非主線程中的async io和do io有什麼區別?
- 6. Python中pycurl和curl有什麼區別
- 7. python中b''和''有什麼區別?
- 8. Python中!r和%r有什麼區別?
- 9. active python和python有什麼區別?
- 10. swift中的同步API和異步API之間有什麼區別?
- 11. 異步調用和回調有什麼區別
- 12. 聚合物異步和作業有什麼區別
- 13. 只使用異步任務和任務有什麼區別?
- 14. Python的__add__和__concat__有什麼區別?
- 15. Python的ElementTree.XML()和ElementTree.fromstring有什麼區別?
- 16. Python的pyautogui.PAUSE和time.sleep有什麼區別?
- 17. 的Python:有什麼區別 - ABS和operator.abs
- 18. 檢查中同步檢查和異步檢查有什麼區別?
- 19. 有什麼區別`和$(Bash中有什麼區別?
- 20. Python,Shapely:Polygon.contains和Polygon.within有什麼區別?
- 21. Python 3.2和3.1有什麼區別?
- 22. Django和Python有什麼區別?
- 23. python mock和magic mock有什麼區別?
- 24. django classonlymethod和python classmethod有什麼區別?
- 25. opencv,python-opencv和libopencv有什麼區別?
- 26. pytz和python-dateutil有什麼區別?
- 27. Python:'is'和'=='有什麼區別?
- 28. PyCUDA和NumbaPro CUDA Python有什麼區別?
- 29. .NET double和python float有什麼區別?
- 30. Python:__builtin__和__builtins__有什麼區別?
Thx〜我也想利用多核心,所以concurrent.futures.ProcessPoolExecutor似乎更好? – leafonsword
@leafonsword那麼,對於使用'requests'庫,你可能可以使用'ThreadPoolExecutor'; HTTP請求是I/O綁定操作,這意味着GIL將在大部分時間被釋放。如果你也試圖同時執行CPU綁定操作,那麼一定要使用'ProcessPoolExecutor'。 – dano