为了账号安全,请及时绑定邮箱和手机立即绑定

Python中的进程间通信

Python中的进程间通信

HUWWW 2019-09-20 17:26:38
在两个不同的python进程之间进行进程间通信的干净而优雅的方法是什么?我目前在操作系统中使用命名管道,但感觉有点hacky。我用dbus服务重写了我的东西,但是看起来当通过SSH会话远程运行代码时,它现在尝试初始化X11,这对于我想做的事情来说似乎完全没有必要(它们与GUI无关)。所以也许dbus有点太重量了。我正准备再次使用套接字进行重新设计,但它看起来很低级,所以我认为可能有一个更高级别的模块我可以导入和使用,我根本就不知道它的名字,我想我应该问SO第一..我的要求是能够运行python foo.py并让这个过程就像守护进程那样做,并且能够向它发送消息python foo.py --bar。后一个调用应该只是向现有进程发送一个消息并终止,可能带有0成功的返回代码或其他失败的代码(因此需要进行一些双向通信)。
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

该multiprocessing库提供了包装套接字的侦听器和客户端,允许您传递任意python对象。


您的服务器可以侦听接收python对象:


from multiprocessing.connection import Listener


address = ('localhost', 6000)     # family is deduced to be 'AF_INET'

listener = Listener(address, authkey='secret password')

conn = listener.accept()

print 'connection accepted from', listener.last_accepted

while True:

    msg = conn.recv()

    # do something with msg

    if msg == 'close':

        conn.close()

        break

listener.close()

您的客户端可以发送命令作为对象:


from multiprocessing.connection import Client


address = ('localhost', 6000)

conn = Client(address, authkey='secret password')

conn.send('close')

# can also send arbitrary objects:

# conn.send(['a', 2.5, None, int, sum])

conn.close()


查看完整回答
反对 回复 2019-09-20
?
jeck猫

TA贡献1909条经验 获得超7个赞

我会用套接字; 本地通信得到了极大的优化,因此您不应该遇到性能问题,并且如果需要,您可以将应用程序分发到不同的物理节点。


关于“低级”方法,你是对的。但您可以根据需要始终使用更高级别的包装器。XMLRPC可能是一个很好的候选者,但对于你正在尝试执行的任务来说可能有些过分。


Twisted提供了一些很好的协议简单实现,例如LineReceiver(用于简单的基于行的消息)或更优雅的AMP(顺便说一句,标准化和以不同语言实现)。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 609 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信