将ipc://更改为tcp:// python zmq(Windows)

时间:2014-11-03 10:46:29

标签: python tcp ipc zeromq

我试图在Windows上运行python应用程序并得到ZMQError:不支持协议 这是因为Windows不支持ipc。 从我所看到的,从ipc到tcp协议的更改应该像更改bind()中使用的字符串一样简单。

        master_addr = 'ipc://{0}/sailfish-master-{1}_{2}'.format(
                tempfile.gettempdir(), os.getpid(), subdomain.id)
        ipc_files.append(master_addr.replace('ipc://', ''))
        sock = ctx.socket(zmq.PAIR)
        sock.bind(master_addr)
        sockets.append(sock) 

如果我将ipc://更改为tcp://我得到ZMQError:参数无效,所以我猜它不是那么简单。 你能不能指引我完成这个固定窗口的过程,或者告诉我我是否在问一个愚蠢的问题。

您可以看到完整的脚本https://github.com/sailfish-team/sailfish/blob/master/sailfish/master.py上面的代码来自第250行。 SailfishCFD是用于GPU的Python Lattice Boltzmann(LBM)仿真包(CUDA,OpenCL)

非常感谢!

1 个答案:

答案 0 :(得分:4)

ZeroMQ与传输无关

这意味着,无论在“引擎盖下”使用什么传输类{ inproc:// | ipc:// | tcp:// | pgm:// | epgm:// },都可以传递消息。

这并不意味着相同的(特定于传输的)寻址语法在任何一种情况下都会起作用。

master_addr = 'ipc://{0}/sailfish-master-{1}_{2}'.format( tempfile.gettempdir(),
                                                          os.getpid(),
                                                          subdomain.id
                                                          )
sock.bind( master_addr )                                  # works on Linux/ipc
#   .bind( <<<tcp_addr>>> )                               # fails on "{0}{1}{2}".format-addressing"

Windows不允许使用ipc:传输类。这种需要改变将影响更广泛的源代码范围,因为在寻址时还有一些与ipc相关的额外假设。

见:

addr         = "tcp://{0}".format( self._subdomain_addr_map[nbid] ) # tcp://<ip>:<port>?
addr         = "tcp://{0}".format( self._iface )                    # ref. #104 missing ":<port>" part!
summary_addr = 'tcp://127.0.0.1:{0}'.format( config._zmq_port )     # port free?

以:

开头

制定问题。您的代码对IPC管道使用变量“fileName” - 类似命名(寻址)。你在那里开始。

try:
     print                                   "DEBUG: Try to .bind() a ", master_addr
     sock.bind( master_addr )
     print                                   "     ==OK."

except ZMQError as Exc:
     print                                   "     ! FAILED:"
     # log & handle Exc details

except:
     print                                   "     ! FAILED: a non-ZMQ-related issue"
     # log & handle Exc details

端口#-s:

请确保您在Windows上执行命令zmq.bind()以触摸“ privriged ”  /已 - 已使用 /防火墙 - “已阻止”TCP-port#-s。

检查了这些系统设置&amp;使zmq-call(s)语法与 tcp:// 传输类的ZeroMQ API兼容,

即:

"tcp://<ip_address>:<port#>" # asString

"tcp://<aDnsResolvableHostNAME>:<port#>" # asString

你拥有它。