基于管道和换行符的ipc解决方案
pipe-io-server的Python项目详细描述
管道IO服务器
基于posix命名管道和换行符的ipc解决方案。
为什么?
当谈到进程之间的通信时,我们经常发现
我们只需要简单地抽象一个基于文本的消息队列
连接两个进程的阻塞send()
和recv()
。
例如,我们可以使用套接字,但这需要编写大量 样板。如果你想养活很多人 编程语言,因为您必须开发和维护 自己的绑定跨所有绑定实现自定义消息传递协议 (将字节流抽象为消息队列)。
您也可以使用类似rabbitmq或redis的消息代理,但这会 强制您在后台运行后台程序。 您可以选择像zeromq这样的东西,但是所有的抽象都有成本。 (即如何从bash shell向zmq套接字发送消息,或者 ZMQ绑定不易获得的环境?).
如果不需要维护any语言绑定到 与不同语言集成? 如果你能依赖一个如此微不足道的api,以至于几乎所有的编程 语言已经提供了吗?
有些开发人员喜欢通过在命名管道之间编写和读取文本行来完成ipc。
原来,由于命名管道就像一个没有seek()
的文件
(stdin
或stdout
是管道),您可以使用readline和print实用程序
使用它们的编程语言。
打开管道会阻塞,直到另一边打开并读取
也会阻塞,直到数据可用。就是我们想要的!
唯一的问题是,为基于管道的io编写服务器并不是 如果您希望避免阻塞主线程,请执行以下操作: 必须为每个管道启动一个线程,避免丢失消息 当客户打开和关闭您的管道时,处理比赛条件等。 要正确地停止这样的服务器尤其困难:死锁很容易遇到 当在管道操作中遇到螺纹堵塞时。 如果您希望您的服务器能够抵御不规则的 客户端行为,如线程阻塞命名管道时删除该管道。 这听起来可能令人沮丧,但这正是我写这封信的原因: 所以你不必。 最后,解决所有这些问题都是值得的:编写客户机是非常简单的事情。
什么?
这个包提供了健壮的异步服务器,能够通过基于文本的 使用命名管道的换行分隔协议。 这使得将任何外部进程集成为插件变得非常容易 进入应用程序:客户机只需打开文件描述符进行读/写 不用担心其他事情。
示例
几行代码抵得上100行api文档。
您可以在echo_server.py
中找到这个包的一个简单用法示例。
一个客户端只需几行bash就可以回复服务器的每条消息
(send
和recv
是管道的路径):
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
包含一套相对全面的单元测试