私はPythonを初めて使用しますが、非同期ループへのアクセスも必要とする、作成したC APIモジュールを使用するuvloopを使用する非同期Pythonアプリを持っています。
1) asyncio にはまだこのための c-api がありませんか? Cで使用可能なイベントループを取得するためのハックはありますか? これはどこかで議論されていますか?
2) uvloop は、C で使い慣れた libuv を使用します。uv_loop_t ポインターを取得できれば、ループにフックできます。私は次のいずれかができると思います:
A) PyObject * を使用して uvloop のループに uv_loop_t* へのオフセットを計算し、それを使用しますか? PyObject_HEAD の長さを知っていると仮定しますか?
libuv_loop = (uv_loop_t*)((void*)(loop)+0x8);
struct __pyx_obj_6uvloop_4loop_Loop {
PyObject_HEAD
uv_loop_t *uvloop;
B) または、ループ ポインターを公開するために uvloop を非ハッキーに変更します。私は cython コードを見たことがないので、ここではまったく無知です。ループで Python 関数を作成し、それを C コードから呼び出して、C ポインタを取得できますか? お気に入り:
(uv_loop_t*)PyObject_CallFunctionObjArgs( getLoop, NULL )
ここに getLoop を追加すると:
https://github.com/MagicStack/uvloop/blob/master/uvloop/loop.pyx
cdef uv.uv_loop_t* _getLoop(self):
return self.uvloop