如何使用 python 信号在独立进程之间发送消息?

Posted

技术标签:

【中文标题】如何使用 python 信号在独立进程之间发送消息?【英文标题】:How can I use python signals to send messages between independent processes? 【发布时间】:2013-01-17 08:38:53 【问题描述】:

我有两种类型的进程。

我希望进程 B 等待来自进程 A 的消息。一旦A 发送消息,进程B 应该处理消息并再次等待。

另外,我将有多个进程实例A 和进程B。因此,所有B 进程都应该将消息发送给所有A 进程。

我正在查看类似signals 的内容,但附加了一个字符串。

最好的方法是什么?

我知道我可以创建一个pipe 并在while 中继续阅读pipe,但这似乎无能为力。另外,它不会在阅读后从pipe 中删除吗?

注意:所有进程都不是彼此的子进程。

【问题讨论】:

进程AB如何相互认识? 他们没有。但如果有帮助,我可以让所有 A 进程在某处注册他们的线程 ID。 【参考方案1】:

这就是我最终做的事情......

将生产者进程变成module并导入消费者。因此,两个进程可以共享变量。

生产者线程将继续生产,消费者线程将继续消费。我正在使用condition 来同步数据,threading.Condition()

每个生产者线程:

获取condition 将数据写入全局变量 致电notifyAll() 发布condition

每个消费者线程:

获取condition 等待condition 读取和处理全局变量中的数据 等待condition...

这只是一个高级视图。在我的例子中,我有不同类型的生产者线程,每个线程都产生不同的数据,并针对特定的消费者群体。所以,我有一个list of condition

Reference on condition

【讨论】:

您在问题中说“进程”,但在答案中说“线程”和“threading.Condition()”。进程和线程具有重要的技术差异。一个进程可以有多个线程。它们都共享进程的地址空间,因此两个线程都可以访问共享模块中的数据。每个进程都有自己的地址空间,因此threading 不会帮助您在进程之间共享数据。【参考方案2】:

我建议将 python 绑定到 ZeroMQ:http://www.zeromq.org/。 pyzmq,也许:https://github.com/zeromq/pyzmq

【讨论】:

以上是关于如何使用 python 信号在独立进程之间发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从信号处理程序内部向其他进程发送通知?

什么相当于使用 python 的 windows 中的 sigusr1-2 信号?

RabbitMQ 消息队列

2022-Java常问面试题总结2

进程通信——管道消息队列共享内存信号量

8.7 进程间的通讯:管道消息队列共享内存信号量信号Socket