2017-08-01 1 views
2

J'ai écrit ce morceau de code:Est-ce que Python asyncio utilise un pool de threads?

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

Il imprime "MainThread" à chaque fois. Cela signifie-t-il que toutes les demandes sont exécutées simultanément à l'aide du même thread principal et n'utilisent pas les threads d'un pool de threads pour exécuter chaque requête ou les threads sont-ils extraits?

Ce message semble montrer que, en fait, il y a un pool de threads qui utilise Python pour ces tâches async: http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/

Répondre

3

Il imprime « MainThread » à chaque fois. Cela signifie-t-il que toutes les demandes sont exécutées simultanément à l'aide du même thread principal et n'utilisent pas les threads d'un pool de threads pour exécuter chaque requête ou les threads sont-ils extraits?

Il n'utilise pas de threads de travail, asyncio utilisera uniquement le thread principal. La simultanéité est obtenue grâce au multitâche coopératif en utilisant des générateurs Python (voir à propos de coroutines).

Ce message semble montrer que, en fait, il y a une piscine de fil ...

Outre le module asyncio, le blog utilise explicitement que vous avez lié le module concurrent.futures. La classe ThreadPoolExecutor de ce code génèrera des threads de travail. Mais l'exemple de code dans votre question ne le sera pas.