我试图在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)
非常感谢!
答案 0 :(得分:4)
这意味着,无论在“引擎盖下”使用什么传输类{ 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
请确保您在Windows上执行不命令zmq.bind()以触摸“ privriged ” /已 - 已使用 /防火墙 - “已阻止”TCP-port#-s。
检查了这些系统设置&amp;使zmq-call(s)语法与 tcp://
传输类的ZeroMQ API兼容,
即:
"tcp://<ip_address>:<port#>"
# asString
或
"tcp://<aDnsResolvableHostNAME>:<port#>"
# asString
你拥有它。