asyncio を使った並列実行はシングルスレッドで動作するから、ロックとかの同期プリミティブいらないじゃん。と思っていたんだけど、そんなことはなかった。実際標準ライブラリにもあるね asyncio.Lock
とか。
結局ロックなどの同期プリミティブの用途は、クリティカルセクションの保護が第一義なわけ。「同時に1つの処理しかしない(=asyncio)」ことと、「クリティカルセクションにただ1つの処理が存在する(=同期プリミティブ)」ことは、似ているようで全然違う。
stackoverflow で似たような議論とサンプルコードを見つけた。
とはいえ、クリティカルセクションを含む処理を同期関数にすればやっぱり同期プリミティブはいらないんじゃない?と思う。いやいや、それは短絡的にすぎる。同期関数にすることによってイベントループ全体が止まるわけで、、、やっぱり非同期な同期プリミティブが必要という結論になる。いやーむずかしいね。