基于管道和换行符的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第三方库


热门话题
在Java7和Java8中从现有列表创建不同的列表?   java如何在HP ALM中上载测试结果   java请检查我想使用的代码,当用户在第一次输入中输入0时,条件必须停止   带显示列表的java OpenGL照明   尝试获取活动的DefaultSharedReferences时发生java NullPointerException   java如何区分日期时间类型应为yyyymmdd hh:mm:ss的两个日期   Java中对象上的循环   java jvm挂起并杀死3&jmap失败   Tomcat下的java URLClassLoader   java如何对基于KinesRecord的DoFn进行单元测试?   java Estado HTTP 404–找不到Eclipse/Tomcat   java Spring:缺少必需的请求正文。无法将JSON传递给RestController   java Drools工作台目标   java@Async在REST类中不起作用   rest如何在用户使用java输入时更有效地从Yammer获取消息?   java监视递归过程中创建的内部堆栈上的值   java如何集群和负载平衡Spring+OSGi应用程序   java NotSerializableException对象