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