在Cython库中使用Python异步接口

2024-09-29 00:13:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C++的外部库,它已经被Cython包了。这个C++库本身不能改变。我想合并这个库,作为Python应用程序的一部分,该应用程序使用asyncio作为其主要进程控制。在

Cython库本质上是使用专有协议来进行网络工作的。但是,当Cython库的事件处理程序在python中启动时,它将阻塞。我已经把它放到了一个阶段,在这里我可以传递一个Python函数,并接收从C++库接收的事件的回调。如果在事件内运行事件处理程序,则可以解决在库事件处理程序处挂起应用程序的库_执行器中的循环运行. 在

我的问题是,我如何才能最好地将其建模为与asnycio配合良好的接口,而不是临时拼凑解决方案来使用Cython库方法?我想写这篇文章异步协议以及异步传输然后使用Cython库作为它的底层通信机制。不过,看起来像个插座,还需要一些猴子来修补。有没有更好的方法或抽象将包装器放在外部库上,使其与asyncio一起工作?在


Tags: 方法函数网络asyncio应用程序处理程序协议进程
1条回答
网友
1楼 · 发布于 2024-09-29 00:13:32

为了回答我自己的问题,据我所知,没有义务使用协议或异步传输中提供的抽象来构造应用程序。对此,我发现最好的建模方法是使用一个定义为async的常规类。然后可以使类看起来像任何符合您要求的模式。如果要包装的代码与套接字的总体用例不同,这一点尤其重要。asyncio提供的抽象本身非常简单。 对于复杂的东西,比如Cython包的C++阻塞代码,需要用多重处理来处理。这是为了避免绞死口译员。Asyncio不允许不做更改就运行阻塞代码。代码必须专门编写为与asyncio兼容。在

我所做的是将整个块代码(包括对象的构造)放入一个使用事件执行的函数中_执行器中的循环运行. 除此之外,我还使用了一个unix套接字与进程进行通信,以获取命令和回调数据。由于使用unix套接字,您可以在主应用程序中使用asnycio方法,管道也是如此。在

以下是我从多进程进程进程生成器向asyncio主进程发送128字节的结果。数据每隔10毫秒生成一次。持续时间使用时间性能计数器(). 以下结果以纳秒为单位。机器本身是Intel(R)Core(TM)i7-2600 CPU@3.40GHz,运行Linux内核4.10.17。在

与uvloop异步

count   10001.000000
mean    76435.956504
std      8887.459462
min     63608.000000
25%     71709.000000
50%     74104.000000
75%     79496.000000
max    287204.000000

标准异步事件循环

^{pr2}$

相关问题 更多 >