asyncioは実際にどのように機能しますか?
この質問は、別の質問「cdefで待機する方法」によって動機付けられています。 Webにはに関する記事やブログ投稿がたくさんありますがasyncio、それらはすべて表面的なものです。asyncio実際にどのように実装されているのか、I / Oが非同期になる原因についての情報は見つかりませんでした。私はソースコードを読み込もうとしていましたが、何千行もの最高級のCコードではありません。その多くは補助オブジェクトを扱っていますが、最も重要なのは、Python構文とそれが変換するCコードとを関連付けるのが難しいことです。に。 Asycnio独自のドキュメントは、あまり役に立ちません。それがどのように機能するかについての情報はそこにはありません、それを使用する方法についてのいくつかのガイドラインだけがあり、これも時々誤解を招く/非常に不十分に書かれています。 私はGoのコルーチンの実装に精通しており、Pythonが同じことを実行することを望んでいました。その場合、上記のリンクで私が思いついたコードはうまくいきました。それができなかったので、私は今、その理由を理解しようとしています。これまでの私の推測は次のとおりです。間違っている箇所を修正してください。 フォームのプロシージャ定義は、async def foo(): ...実際にはクラスを継承するメソッドとして解釈されますcoroutine。 おそらく、async def実際にはawaitステートメントによって複数のメソッドに分割され、これらのメソッドが呼び出されるオブジェクトは、これまでの実行を通じて行われた進行状況を追跡できます。 上記が真の場合、基本的に、コルーチンの実行は、いくつかのグローバルマネージャー(ループ?)によるコルーチンオブジェクトのメソッドの呼び出しに要約されます。 グローバルマネージャーは、I / O操作がPython(のみ?)コードによっていつ実行されるかをどうにか(方法?)認識しており、現在実行中のメソッドが制御を放棄した後に実行する保留中のコルーチンメソッドの1つを選択できます(awaitステートメントのヒット))。 言い換えると、これは、いくつかのasyncio構文をよりわかりやすいものに「脱糖」するための私の試みです。 async def coro(name): print('before', name) await asyncio.sleep() print('after', name) asyncio.gather(coro('first'), coro('second')) # translated from async def coro(name) class Coro(coroutine): def before(self, name): print('before', name) def after(self, name): print('after', name) def __init__(self, name): self.name …