我是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(或非黑客修改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
asyncio
还没有C API。
我们计划在未来的Python版本(可能是3.8(中添加它。
现在你应该使用PyObject_*
api。
uvloop
是用Cython
编写的,但该库也没有公共C API。 您可以访问私有uvloop
API,但公开的函数名称和数据结构可以随时更改,恕不另行通知,因为它们被视为私有的,用户永远不应使用它。
也在寻找这个,巧合的是,碰巧几天前uvloop
添加了一个loop.get_uv_loop_t_ptr()
方法:)
https://github.com/MagicStack/uvloop/pull/310
现在我们只需要等待包含此 PR 的新版本(v0.17 ?((或自己构建(。