2016-10-30 6 views
4

CocoaのNSRunLoopやQtのQEventLoopなどの既存の実行ループの実装に基づいて、asyncioにプラグインするための新しいイベントループの実装を検討しています。始める場所を選ぶことは難しいと思う。カスタムPython asyncioイベントループの実装方法を知るにはどうすればよいですか?

ドキュメントには、システムがプラガブルになるように設計されていると書かれていますが、これは正確にはとは言いません。これを行うことができます。 AbstractEventLoop、またはBaseEventLoopで始める必要がありますか?どのような方法で何を提供する必要がありますか?役に立つと思う唯一の代替実装はuvloopですが、私が慣れていないCythonとlibuvに大きく依存しているため、理解が困難です。

イベントループの実装がどのように行われ、どのようにカスタムループを作成できるかについての覚書はありますか?それとも、私は頭をもっと速く包み込むことができますか?任意のポインターをありがとう。

答えて

1

documentationは、AbstractEventLoopから継承しています。

その他の質問については、ドキュメントは非常にはっきりしませんでしたが、具体的なイベントループのsource codeasyncioになりました。私は pretty minimal exampleAbstractEventLoopから継承して作成し、イベント駆動型シミュレータを作成しました。

  • create_taskを実装している私が言われるのが好きていると思います主なもの。エンドユーザはasyncio.ensure_future(coro())を使用してコルーチンをスケジュールしますが、これはループのcreate_taskメソッドを呼び出すだけです。 def create_task(self, coro): return asyncio.Task(coro, loop=self)以上である必要はありません。

  • call_sooncall_atおよびcall_later。これらはエンドユーザによって呼び出され、プレーンコールバック機能をスケジュールします。また、エンドユーザがコルーチンをスケジュールするたびに、非同期/待機システムによって自動的に呼び出されます。

  • 通常のコールバックで例外が発生した場合は、ループのcall_exception_handlerメソッドに移動します。コルーチンが例外を発生させた場合、例外は非同期の非同期の土地に存在し、catch it thereにする必要があります。

  • source code for AbstractEventLoopを参照すると、上書きする必要がある他のすべての方法が表示されます。ボーナス:いくらか役に立つコメント。