【问题标题】:changing ipc:// to tcp:// python zmq (Windows)将 ipc:// 更改为 tcp:// python zmq (Windows)
【发布时间】:2014-12-30 00:13:48
【问题描述】:

我没有尝试让 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) 

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

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

非常感谢!

【问题讨论】:

    标签: python tcp ipc zeromq


    【解决方案1】:

    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 上执行 not 命令 zmq.bind() 来触摸“priviliged” / 已经-使用 / 防火墙-"blocked" TCP-port#-s.

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

    即:

    "tcp://&lt;ip_address&gt;:&lt;port#&gt;" # asString

    "tcp://&lt;aDnsResolvableHostNAME&gt;:&lt;port#&gt;" # asString

    你有它。

    【讨论】:

    • 非常感谢您的详细解答!
    • 很高兴知道,您认为它很有帮助,Dimitar。您可能想知道,StackOverflow 鼓励用户在 QuestionsAnswers 上通过 +1 表达这一点,用户发现一些有趣或重要的东西为她/他的工作。不要犹豫,并享受成为这个伟大的 StackOverflow 专业社区的贡献成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多