2017-08-01 92 views
2

我寫這段代碼:Python asyncio使用線程池嗎?

import asyncio 
import threading 
from aiohttp import ClientSession 

async def fetch(url): 
    async with ClientSession() as session: 
     async with session.get(url) as response: 
      response = await response.read() 
      print(threading.current_thread().name) 


loop = asyncio.get_event_loop() 

tasks = [asyncio.ensure_future(fetch("http://example.com")) for i in range(5)] 

loop.run_until_complete(asyncio.wait(tasks)) 

它打印出 「MainThread」 每次。這是否意味着所有的請求都是使用相同的主線程併發執行的,並且它不使用線程池中的線程來執行每個請求,還是線程被抽象化?

這個職位似乎表明,事實上存在是Python使用這些異步任務的線程池: http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/

回答

3

它打印出「MainThread」每次。這是否意味着所有的請求都是使用相同的主線程併發執行的,並且它不使用線程池中的線程來執行每個請求,還是線程被抽象化?

它不使用工作線程,asyncio只會使用主線程。通過使用Python生成器進行協作式多任務實現併發性(閱讀有關coroutines)。

這個職位似乎表明,實際上有一個線程池...

除了asyncio模塊,您明確鏈接的博客文章使用concurrent.futures模塊。該代碼中的ThreadPoolExecutor類將產生工作線程。但是你的問題中的示例代碼不會。