Python asyncio是否使用线程池?

时间:2017-08-01 01:55:29

标签: python multithreading python-asyncio aiohttp

我写了这段代码:

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/

1 个答案:

答案 0 :(得分:8)

  

每次打印出“MainThread”。这是否意味着所有请求都是使用相同的主线程并发执行的,并且它不是使用线程池中的线程来执行每个请求,还是被抽象的线程?

它不使用工作线程,asyncio只会使用主线程。并发是通过使用Python生成器进行协作式多任务处理来实现的(阅读coroutines)。

  

这篇文章似乎表明事实上有一个线程池......

asyncio模块一样,您明确链接的博客文章使用concurrent.futures模块。该代码中的ThreadPoolExecutor类将生成工作线程。但是你问题中的示例代码不会。