我对python完全不熟悉,但是使用uvloop有一个异步python应用程序,它使用我创建的C api模块,它也需要访问异步循环。
1)asyncio还没有这个c-api?任何在C中使用事件循环的hack?这是在哪里讨论?
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
答案 0 :(得分:7)
asyncio
还没有C API。
我们计划在未来的Python版本中添加它(可能是3.8版本)。
现在你应该使用PyObject_*
api。
uvloop
写在Cython
中,但该库也没有 Public C API。您可以访问私有uvloop
API,但可以随时更改公开的函数名称和数据结构,而不会发布公告,因为它们被视为私有,用户不应该使用它。