3

私は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
4

1 に答える 1

9

asyncioにはまだ C API がありません。

将来の Python バージョン (おそらく 3.8) で追加する計画があります。

PyObject_*現時点では、 apiを使用する必要があります。

uvloopで書かれてCythonいますが、ライブラリにはPublic C API もありません。プライベート API にアクセスすることはできuvloopますが、公開されている関数名とデータ構造は、プライベートと見なされるため、公開通知なしにいつでも変更できます。ユーザーは決して使用しないでください。

于 2018-04-13T09:00:27.130 に答える