Python zmq.error.ZMQError:非套接字上的套接字操作:如何在关闭前查找活动套接字?
在我的应用程序中,我创建了2个套接字,并尝试了以下操作:Python zmq.error.ZMQError:非套接字上的套接字操作:如何在关闭前查找活动套接字?,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,在我的应用程序中,我创建了2个套接字,并尝试了以下操作: try: socketA.connect("tcp://localhost:5557") socketB.bind("tcp://localhost:5558") except zmq.ZMQError as e: if e.errno == zmq.EINVAL: logger.error("Endpoint supplied is invalid") else: log
try:
socketA.connect("tcp://localhost:5557")
socketB.bind("tcp://localhost:5558")
except zmq.ZMQError as e:
if e.errno == zmq.EINVAL:
logger.error("Endpoint supplied is invalid")
else:
logger.error("The ZeroMQ error with an error number {0}".format(e.errno))
raise ZMQError(e)
cleanUp()
如果由于某种原因,其中一个套接字无法.connect()
/.bind()
,我想关闭这两个套接字并在cleanUp()
函数中终止上下文,但在关闭它们之前,我如何知道哪些套接字处于活动状态
ZeroMQ在很好地关闭活动套接字之前是否提供了有关它们的任何信息?鉴于上述逻辑,让我们使用另一种方法:
案例A:两个套接字分别执行了.connect()
+.bind()
。情况B:任何套接字都没有这样做
try:
socketA.connect( "tcp://localhost:5557" )
socketA.setsockopt( zmq.LINGER, 0 )
try:
socketB.bind( "tcp://localhost:5558" )
socketB.setsockopt( zmq.LINGER, 0 )
except zmq.ZMQError as e:
if ( e.errno in ( zmq.EINVAL,
zmq.EPROTONOSUPPORT,
zmq.ENOCOMPATPROTO,
zmq.EADDRINUSE,
zmq.EADDRNOTAVAIL,
)
):
logger.error( "ZeroMQ TransportClass / Endpoint cannot be setup for [socketB]." )
if ( e.errno in ( zmq.ENODEV,
zmq.ENOTSOCK,
)
):
logger.error( "ZeroMQ request was made against a non-existent device or not using a valid socket [socketB]." )
if ( e.errno in ( zmq.ETERM,
zmq.EMTHREAD,
)
):
logger.error( "ZeroMQ Context is not in a state to handle this request for [socketB]." )
cleanUp( aContextINSTANCE, [ socketA, socketB, ] )
except zmq.ZMQError as e:
if ( e.errno in ( zmq.EINVAL,
zmq.EPROTONOSUPPORT,
zmq.ENOCOMPATPROTO,
)
):
logger.error( "ZeroMQ TransportClass / Endpoint cannot be setup for [socketA]." )
if ( e.errno in ( zmq.ETERM,
zmq.EMTHREAD,
)
):
logger.error( "ZeroMQ Context is not ready to handle this request for [socketA]." )
if ( e.errno in ( zmq.ENOTSOCK, ) ):
logger.error( "ZeroMQ operation was requested, but not on a valid [socketA]." )
cleanUp( aContextINSTANCE, [ socketA, ] )
finally:
# ...
pass
def cleanUp( aContextToTERMINATE, aListOfSocketsToCLOSE = [] ):
for aSocket in aListOfSocketsToCLOSE:
try:
aSocket.close() # external responsibility to setup LINGER as zero right at aSocket instantiation point
except:
pass
try:
aContextToTERMINATE.term()
except:
pass
finally:
# ...
pass
我不完全清楚你所说的“哪些插座是活的”是什么意思。无论哪个
连接
/绑定
调用失败,都必须关闭两个套接字。在C libzmq术语中,zmq\u close
不是zmq\u connect
/zmq\u bind
,而是zmq\u socket
。
pyzmq中的
zmq\u socket
已被socket调用。\uuuu init\uuuu
谢谢您的回答!是否有特定原因将linger设置为0。在关闭套接字之前,我将其设置为-1,因为我希望数据在导线中可用,即使在发送几条消息后套接字关闭。当然这是原因。任何非零的逗留
都会在尝试.close()
时阻塞,分布式系统应该公平地避免阻塞。即使当程序离开时,它的行为也应该是无阻塞的,以免失控——在阻塞状态下,您的代码对发生的事情没有控制权&只是被动地挂起在外部事件的静默中(这些事件永远不会发生…)。阻塞资源和失控通常不是一个好主意,是吗?