3

我对 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
4

1 回答 1

9

asyncio还没有 C API。

我们计划在未来的 Python 版本(可能是 3.8)中添加它。

现在你应该使用PyObject_*api。

uvloop是用编写的,Cython但该库也没有公共C API。您可以访问私有uvloopAPI,但公开的函数名称和数据结构可以随时更改,无需公开通知,因为它们被认为是私有的,用户不应该使用它。

于 2018-04-13T09:00:27.130 回答