基于管道和换行符的ipc解决方案

pipe-io-server的Python项目详细描述


管道IO服务器

基于posix命名管道和换行符的ipc解决方案。

为什么?

当谈到进程之间的通信时,我们经常发现 我们只需要简单地抽象一个基于文本的消息队列 连接两个进程的阻塞send()recv()

例如,我们可以使用套接字,但这需要编写大量 样板。如果你想养活很多人 编程语言,因为您必须开发和维护 自己的绑定跨所有绑定实现自定义消息传递协议 (将字节流抽象为消息队列)。

您也可以使用类似rabbitmq或redis的消息代理,但这会 强制您在后台运行后台程序。 您可以选择像zeromq这样的东西,但是所有的抽象都有成本。 (即如何从bash shell向zmq套接字发送消息,或者 ZMQ绑定不易获得的环境?).

如果不需要维护any语言绑定到 与不同语言集成? 如果你能依赖一个如此微不足道的api,以至于几乎所有的编程 语言已经提供了吗?

有些开发人员喜欢通过在命名管道之间编写和读取文本行来完成ipc。 原来,由于命名管道就像一个没有seek()的文件 (stdinstdout管道),您可以使用readline和print实用程序 使用它们的编程语言。 打开管道会阻塞,直到另一边打开并读取 也会阻塞,直到数据可用。就是我们想要的!

唯一的问题是,为基于管道的io编写服务器并不是 如果您希望避免阻塞主线程,请执行以下操作: 必须为每个管道启动一个线程,避免丢失消息 当客户打开和关闭您的管道时,处理比赛条件等。 要正确地停止这样的服务器尤其困难:死锁很容易遇到 当在管道操作中遇到螺纹堵塞时。 如果您希望您的服务器能够抵御不规则的 客户端行为,如线程阻塞命名管道时删除该管道。 这听起来可能令人沮丧,但这正是我写这封信的原因: 所以你不必。 最后,解决所有这些问题都是值得的:编写客户机是非常简单的事情。

什么?

这个包提供了健壮的异步服务器,能够通过基于文本的 使用命名管道的换行分隔协议。 这使得将任何外部进程集成为插件变得非常容易 进入应用程序:客户机只需打开文件描述符进行读/写 不用担心其他事情。

示例

几行代码抵得上100行api文档。 您可以在echo_server.py中找到这个包的一个简单用法示例。

一个客户端只需几行bash就可以回复服务器的每条消息 (sendrecv是管道的路径):

while IFS= read -r message; do
    printf "Received: ${message}\n"
    # ... do something ...
    printf "Some response\n" > "send"
done < "recv"

更多示例:

  • pipe_io_server/clients包含如何在不同语言中使用管道的示例
  • pipe_io_server/test_pipe_io_server.py包含一套相对全面的单元测试

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
试图读取字段“java”。lang.反对安卓。util。一对首先   gradle对java的影响。属性作为任务的输入?   java我的return语句不起作用。我做错了什么?   java通用同步代码块[无对象锁定]   macos Java小程序游戏不能在Mac上运行,即使它可以在PC上运行   java Firebase GeoFire设置位置未在服务中工作   java排序字符串对象   java通过JLabel上传背景图像(jpg)后,如何将图像缩放到它所在的面板上?   java无法连接到jsp中的数据库   java如何在整个ant taskdef操作的执行过程中拥有一个singleton类实例   java如何在按键事件中检查JTtextField中的字符串数字验证器   如何最好地输出大型单行XML文件(使用Java/Eclipse)?   内存不足,Java运行时环境无法在Java应用程序中继续运行   java Hibernate连接错误:组织上的NullPointerException。冬眠hql。阿斯特。HqlSqlWalker。createFromJoinElement   linux将参数从shell脚本传递到java类   java对于接受多个参数的setter是否有类似于@JsonCreator的注释?   java在链表中添加节点