2017-08-01 16 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クラスは、ワーカースレッドを生成します。しかし、あなたの質問のサンプルコードはそうではありません。

関連する問題