Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python zmq.error.ZMQError:非套接字上的套接字操作:如何在关闭前查找活动套接字?_Python_Zeromq_Pyzmq - Fatal编程技术网

Python zmq.error.ZMQError:非套接字上的套接字操作:如何在关闭前查找活动套接字?

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

在我的应用程序中,我创建了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:
        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()
时阻塞,分布式系统应该公平地避免阻塞。即使当程序离开时,它的行为也应该是无阻塞的,以免失控——在阻塞状态下,您的代码对发生的事情没有控制权&只是被动地挂起在外部事件的静默中(这些事件永远不会发生…)。阻塞资源和失控通常不是一个好主意,是吗?