1

我正在尝试复制 ZMQ 指南中描述的呼吸机/工人/水槽范例。我有与 ZMQ 示例中描述的相同的 Python Ventilator、相同的 C++ worker 和相同的 Python Sink。我想从一个主要的 Python 脚本启动呼吸机、工作程序和水槽,所以我在呼吸机和水槽周围创建了“类”包装器,这两个类都是 Python 模块“multiprocessing.Process”的子类。由于 C++ 是二进制文件,因此我使用 Python 的 subprocess.Popen 调用来启动它。

启动所有这些的顺序如下:

h = subprocess.Popen('test')  # test is the name of the binary
time.sleep(1)
s = sinkObj.start()
time.sleep(1)
v = ventObj.start()

我发现当我像这样启动组件时没有数据通过系统。但是,如果我在自己的 shell 中启动 C++ 二进制文件,并且只从主 python 脚本启动 sinkObj 和 ventObj,它就可以正常工作。

如果这更像是一个 Python 问题而不是 ZMQ 问题,我提前道歉,但我没有遇到像 Python 子进程这样的问题。我也尝试过使用 os.system() 而不是子进程......但同样的问题。我把所有的代码放在这个网站上:https ://github.com/kkarrancsu/zmqtest 如果有人想测试一下。该 git 上有一个自述文件,它告诉您文件是什么。

关于为什么会发生这种情况的任何想法?

- - - - - - - - - - - - - 更新 - - - - - - - - - -

我发现,如果我创建一个简单地启动 C 二进制文件的 shell 脚本,并使用 os.system('run_the_shell_script') 调用该 shell 脚本,它就可以工作!所以这意味着我使用 subprocess.Popen(...) 的方式有问题,但似乎无法确定问题所在。我尝试使用 shell=True 标志,但它仍然挂起......

4

2 回答 2

1

worker是导致问题的二进制文件的名称。

有两种解决方案:

  • 将二进制文件test的名称更改为test_new并在您的All.py文件中执行相同的操作,然后它将按您的意愿工作。
  • 代替. subprocess.Popen('./test', shell=True)_subprocess.Popen('test', shell=True)

test是 Linux 命令。如果您在 shell 中键入以下内容

$ echo $PATH

您可能会看到它.位于最后一个位置。意思是,直到shell在$PATH所指示的目录中找不到要执行的二进制文件,才会尝试在当前目录中搜索,.
当你执行subprocess.Popen('test', shell=True)时,它会在尝试目录之前找到它.,所以它赢了不执行workers.

于 2013-12-18T01:57:12.900 回答
0

如我所见,呼吸机和接收器bind()连接到端口 6557 和 6558,C++ 应用程序connect()连接到这些端口。在这种情况下,如果您cpp先启动应用程序,它会尝试到达connect()端点,但由于没有任何东西绑定在那里,它会静默下降。ZeroMQ 的基本原则是“先绑定,后连接”。所以你不应该connect()在你之前把bind()东西放在socket上。想象一下bind()是“服务器”,并且connect()是客户端。您无法将客户端连接到不存在的服务器。此外,在 ZeroMQ 中,每个套接字都可以是“服务器”,但每个 URL 应该只有 1 个 bind()-ing 套接字。你可以有多个'connect()'。

于 2013-12-16T20:07:25.537 回答