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

Dim*_*iev 5 python tcp ipc zeromq

我不想让 python 应用程序在 Windows 上运行,但我得到了一个 ZMQError: Protocol not supported 这是因为 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) 
Run Code Online (Sandbox Code Playgroud)

如果我将 ipc:// 更改为 tcp:// 我得到 ZMQError: Invalid argument 所以我想这不是那么简单。你能告诉我为 Windows 修复这个问题的过程吗,或者告诉我我是否在问一个愚蠢的问题。

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

非常感谢!

use*_*197 5

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"
Run Code Online (Sandbox Code Playgroud)

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?
Run Code Online (Sandbox Code Playgroud)

从...开始:

框架问题。您的代码对 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
Run Code Online (Sandbox Code Playgroud)

端口#-s:

要确保你不会在Windows命令zmq.bind()接触“具有特权的” / already-使用/防火墙- “封锁” TCP端口#-s。

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

IE:

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

或者

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

你拥有了它。

  • 很高兴知道,你认为这很有帮助,迪米塔尔。您可能想知道,StackOverflow 鼓励用户在 **问题** 和 **答案** 上通过 **+1** 表达这一点,用户在其中发现一些对她/他的工作感兴趣或重要的内容。请毫不犹豫地这样做,并享受成为这个伟大的 StackOverflow 专业社区的贡献成员。 (2认同)