我对 python 完全陌生,但是有一个使用 uvloop 的异步 python 应用程序,它使用我创建的 C api 模块,它也需要访问异步循环。
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) 或者非 hacky 修改 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