代码之家  ›  专栏  ›  技术社区  ›  lorenzocastillo

Python asyncio是否使用线程池?

  •  12
  • lorenzocastillo  · 技术社区  · 7 年前

    我写了以下代码:

    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))
    

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

    http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/

    1 回复  |  直到 7 年前
        1
  •  13
  •   wim    7 年前

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

    它没有使用工作线程, asyncio 将仅使用主线程。通过使用Python生成器进行协作多任务处理来实现并发性(阅读 coroutines

    异步 模块中,您链接的博客帖子显式使用 concurrent.futures ThreadPoolExecutor 该代码中的类将生成工作线程。但您问题中的示例代码不会。