我对python完全陌生,但有一个使用uvloop的异步python应用程序,它使用我创建的have模块,它还需要访问异步循环。
1)异步到现在还没有一个c-api用于这一点?任何可以在C中使用的事件循环的黑客?这件事有讨论过吗?
2) uvloop使用了我在C中熟悉的libuv。如果我能够捕获uv_loop_t指针,就可以将其连接到循环中。我想我可以:
( A)使用PyObject * to 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发布于 2018-04-13 09:00:27
asyncio还没有C。
我们计划在将来的Python版本中添加它(3.8可能)。
现在您应该使用PyObject_* api。
uvloop是用Cython编写的,但是库中也没有公共C。您可以访问私有的uvloop API,但是公开的函数名称和数据结构可以在任何时候更改而不需要公开通知,因为它们被认为是私有的,用户永远不应该使用它。
发布于 2022-08-28 07:45:36
uvloop也在寻找这个方法,巧合的是,几天前uvloop添加了一个loop.get_uv_loop_t_ptr()方法:)
https://github.com/MagicStack/uvloop/pull/310
现在我们只需要等待一个新的版本(v0.17 ?)这包括这个公关(或者自己建立它)。
https://stackoverflow.com/questions/49806841
复制相似问题