如何从C

时间:2018-04-12 22:36:42

标签: cython python-asyncio c-api uvloop

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

1 个答案:

答案 0 :(得分:7)

asyncio还没有C API。

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

现在你应该使用PyObject_* api。

uvloop写在Cython中,但该库也没有 Public C API。您可以访问私有uvloop API,但可以随时更改公开的函数名称和数据结构,而不会发布公告,因为它们被视为私有,用户不应该使用它。