Task

asyncio.create_task 関数によるTaskの作成

>>> import asyncio
>>>
>>> async def func():
...     pass
...
>>> async def main():
...     task = asyncio.create_task(func())
...     print(type(task))
...
>>> asyncio.run(main())
<class '_asyncio.Task'>

Taskオブジェクトが生成される

単にコルーチンをawaitして実行

 1import asyncio
 2import time
 3
 4
 5async def main():
 6    await asyncio.sleep(2)
 7    await asyncio.sleep(5)
 8
 9
10start = time.time()
11asyncio.run(main())
12print(f"time: {time.time() - start}")

実行結果: time: 7.0069193840026855

Taskを作成して実行

 1import asyncio
 2import time
 3
 4
 5async def main():
 6    task1 = asyncio.create_task(asyncio.sleep(2))
 7    task2 = asyncio.create_task(asyncio.sleep(5))
 8    await asyncio.gather(task1, task2)
 9
10
11start = time.time()
12asyncio.run(main())
13print(f"time: {time.time() - start}")

実行結果: time: 5.004063844680786

並行なTask実行

  • awaitableオブジェクトを並行して実行

  • asyncio.gather に渡されたシーケンスは並行実行される

asyncio.gatherにコルーチンを渡した例

 1import asyncio
 2import time
 3
 4
 5async def main():
 6    await asyncio.gather(asyncio.sleep(2), asyncio.sleep(5))
 7
 8
 9start = time.time()
10asyncio.run(main())
11print(f"time: {time.time() - start}")

実行結果: time: 5.007250785827637

練習問題

次のコードの get_status_code 関数を並行に実行する main 関数を作成してください

 1import asyncio
 2import time
 3
 4import aiohttp
 5
 6
 7async def get_status_code(n):
 8    url = f"https://httpbin.org/delay/{n}"
 9
10    async with aiohttp.ClientSession() as session:
11        async with session.get(url) as response:
12
13            print("Status:", response.status)
14
15
16start = time.time()
17asyncio.run(get_status_code(3))
18print(f"time: {time.time() - start}")