鉴于上述逻辑,让我们采用另一种方法:
情况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()
except:
pass
try:
aContextToTERMINATE.term()
except:
pass
finally:
pass
.close()
时阻塞,分布式系统应该遵循公平原则,不应该阻塞。即使程序关闭,它也应该表现得无阻塞,以免失去控制——在阻塞状态下,您的代码对发生的事情没有任何控制,只是被动地停留在外部事件的沉默中(这些事件可能永远不会发生...)。阻塞资源和失去控制通常不是一个好主意,不是吗? - user3666197