2017-08-01 49 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类将产生工作线程。但是你的问题中的示例代码不会。