独立 Python3 脚本之间的进程间通信

shi*_*ina 7 python multiprocessing

我们可以使用标准的 multiprocessing.Queue 类在独立的 Python3 脚本之间进行通信,例如

bash% ./aaa.py &
bash% ./bbb.py &
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有另一个库,如标准多处理模块,用于与独立脚本通信。

shi*_*ina 9

这是一个自我回答。我的最小示例如下。

aaa.py

from multiprocessing.managers import BaseManager
import queue

queue_a = queue.Queue()
queue_b = queue.Queue()
BaseManager.register('queue_a', callable=lambda: queue_a)
BaseManager.register('queue_b', callable=lambda: queue_b)
m = BaseManager(address=('', 50000), authkey=b'qwerty')
m.start()

shared_queue_a = m.queue_a()
shared_queue_b = m.queue_b()

shared_queue_a.put("How are you?")
msg = shared_queue_b.get()
print("%s: %s" % (__file__, msg))

m.shutdown()
Run Code Online (Sandbox Code Playgroud)

bbb.py

from multiprocessing.managers import BaseManager


BaseManager.register('queue_a')
BaseManager.register('queue_b')
m = BaseManager(address=('localhost', 50000), authkey=b'qwerty')
m.connect()

queue_a = m.queue_a()
queue_b = m.queue_b()

msg = queue_a.get()
print("%s: %s" % (__file__, msg))
queue_b.put("I'm fine.")
Run Code Online (Sandbox Code Playgroud)

运行这些脚本。

./aaa.py &; sleep 1; ./bbb.py
Run Code Online (Sandbox Code Playgroud)

印刷

./bbb.py: How are you?
./aaa.py: I'm fine.
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是您只发布了自我回答而没有发布解释。目前还不清楚什么是 BaseManager,它是如何工作的,以及为什么有 2 个队列而不是一个? (3认同)

Sha*_*ger 6

查看文档中有关“侦听器和客户端”multiprocessing的部分;与更高级别的更简单的 API 不同,这些 API 允许您通过地址建立连接并对配对进程进行身份验证,这允许两个 Python 脚本在没有父/子关系的情况下进行协作。