0
0

(Python)asyncio試す

Last updated at Posted at 2024-07-04

初めに

並「行」処理扱うことになったので備忘録として残しておきます。

コード

heiko.py
import asyncio
import time

async def hoge():
	print('タスク1です')
	# asyncio.sleep()は指定時間だけタスクを中断し、その間他のタスクに制御を握らせるタスクです
	# これによりタスク1が2秒間中断されタスク2が走ります
	await asyncio.sleep(2)
	print('タスク1でした')

async def fuga():
	print('タスク2です')
	for l in range(100000000):
		n = l
	print('タスク2でした')

async def main():

	print('開始')
	start = time.time()
	# create_taskにコルーチンを渡すとタスクになります
	# taskは定義と同時にスケジューリングされますが、実行されるタイミングはイベントループ次第です
	task1 = asyncio.create_task(hoge())
	task2 = asyncio.create_task(fuga())
	# await タスク名 で制御を手放し、タスクの完了を待ちます
	await task1
	await task2
	# タスクの完了後に実行したい処理はawait以降に記述します
	print(time.time() - start)
	print('終了')

# コルーチンを渡してイベントループを起動します
asyncio.run(main())

動作

1.開始時刻を取得する
2.タスク1とタスク2がイベントループに追加される
3.イベントループはタスク1の完了を待つ
4.タスク1は2秒間処理を中断し、その間はタスク2に制御が渡る
5.タスク2の処理は(環境にもよるが)1.9秒程度で終了し、標準出力に終了通知を出す
6.タスク1に制御が渡り、終了通知を出力してイベントループに制御が戻る
7.イベントループはタスク2の終了を待つが、既に終了している
8.時刻の差分から経過時間を導出してオワリッ!
※タスク2のforループが2秒以上かかる場合は2秒経ってもタスク1に制御が渡らないので注意

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0