私はかなりasyncioに新しく、次のシナリオを構築する方法についていくつかのアドバイスが必要です。私はコールバックを受け入れるCython拡張を持っています。前者は、新しいイベントが到着するたびに実行されます。しかし、それらのイベントを収集する機構を開始することは、ブロック動作であり、すなわち、主スレッドをブロックする。 また、Cython拡張はasyncio.Queue
を受け入れ、コールバックからput_nowait
メソッドを呼び出します。これで、イベントを処理するキューのコンシューマを設定します。これは、シナリオの背後にある可能擬似コードのようになります。私は例を実行するとasyncioのトラブルとアドバイス
aioq = asyncio.Queue(1000)
cext = CythonExtension(aioq)
def c(aioq):
while not aioq.empty():
e = yield from aioq.get()
loop.create_task(c(aioq))
# i'm not sure how to run the event loop
# and keep on initializing the cython extension
# because this call also blocks...
#loop.run_forever()
# so i tried this.
loop.run_in_executor(None, cext.start) <- this is a blocking operation
# start the event loop
loop.run_forever()
、asyncio
キューがイベントで満たされているが、c
タスクが実行されることはありません - 私は、キューからすべてのイベントを取得することはできませんよ。これに対処する方法に関するフィードバックや指摘を感謝します。
私の質問には答えません。しかし、それはGILの限界を克服するためにコードをリファクタリングする動機となっています。私は非常に高いパフォーマンスの向上を実験しています。 – Nedo
まあ、何とか助けてくれてうれしいですね。私は本当にそれを助けるために十分に「asyncio」を理解していないのではないかと思います(この答えはCythonで時折起こる問題なので、少し推測でした)。 'CythonExtension'の簡略化されたサンプルコードを表示した場合、誰かがその質問に答えるのを助けるかもしれません – DavidW
もう1つの考え:' c'は実行し、空のキューを見つけて、 (または誤解ですか?) – DavidW