Python Circus/ZeroMQ“;“正在使用的插座”;错误

Python Circus/ZeroMQ“;“正在使用的插座”;错误,python,flask,zeromq,circusd,Python,Flask,Zeromq,Circusd,我正在运行一个Flask应用程序,并在内部使用Node.js中编写的库,我通过ZeroRPC访问该库(实际的节点进程由Circus管理)。这本身就很好;我可以毫无问题地进行单元测试。但是,当作为侦听进程启动Flask应用程序并调用调用此库的REST api时,程序在尝试启动该进程时抛出异常。启动服务的代码如下所示: from circus.watcher import Watcher from circus.arbiter import ThreadedArbiter from circus.u

我正在运行一个Flask应用程序,并在内部使用Node.js中编写的库,我通过ZeroRPC访问该库(实际的节点进程由Circus管理)。这本身就很好;我可以毫无问题地进行单元测试。但是,当作为侦听进程启动Flask应用程序并调用调用此库的REST api时,程序在尝试启动该进程时抛出异常。启动服务的代码如下所示:

from circus.watcher import Watcher
from circus.arbiter import ThreadedArbiter
from circus.util import (DEFAULT_ENDPOINT_DEALER, DEFAULT_ENDPOINT_SUB,
     DEFAULT_ENDPOINT_MULTICAST)
class Node(object):
    {... omitted code that initializes self._arbiter and self._client ...}
    def start(self):
        if self._arbiter and self._client:
            return
        port = 'ipc:///tmp/inlinejs_%s' % os.getpid()
        args = 'lib/server.js --port %s' % port
        watcher = Watcher('node', '/usr/local/bin/node', args,
            working_dir=INLINEJS_DIR)
        self._arbiter = ThreadedArbiter([watcher], DEFAULT_ENDPOINT_DEALER,
            DEFAULT_ENDPOINT_SUB, multicast_endpoint=DEFAULT_ENDPOINT_MULTICAST)
        self._arbiter.start()
        self._client = zerorpc.Client()
        self._client.connect(port)
此函数返回,但不久之后在一个单独的线程中,我得到以下错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/python/lib/python2.7/site-packages/circus/_patch.py", line 21, in _bootstrap_inner
    self.run()
  File "/python/lib/python2.7/site-packages/circus/arbiter.py", line 647, in run
    return Arbiter.start(self)
  File "/python/lib/python2.7/site-packages/circus/util.py", line 319, in _log
    return func(self, *args, **kw)
  File "/python/lib/python2.7/site-packages/circus/arbiter.py", line 456, in start
    self.initialize()
  File "/python/lib/python2.7/site-packages/circus/util.py", line 319, in _log
    return func(self, *args, **kw)
  File "/python/lib/python2.7/site-packages/circus/arbiter.py", line 427, in initialize
    self.evpub_socket.bind(self.pubsub_endpoint)
  File "socket.pyx", line 432, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4022)
  File "checkrc.pxd", line 21, in zmq.core.checkrc._check_rc (zmq/core/socket.c:5838)
ZMQError: Address already in use

我不知道为什么会发生这种情况,尤其是在单元测试中没有发生这种情况。有人能解释一下吗?

一般来说,当您遇到这种类型的“地址正在使用”错误时,这意味着您的程序正在尝试绑定一个IP端口号,但其他东西先到达了那里

我不熟悉这个库,但由于错误是由“evpub_socket.bind”引起的,我猜您与常量DEFAULT_ENDPOINT_SUB指定的端口号有冲突。从circus源代码中,我看到了以下常量:

默认\u端点\u经销商=”tcp://127.0.0.1:5555" 默认_端点_子=”tcp://127.0.0.1:5556" 默认_端点_统计=”tcp://127.0.0.1:5557"

检查您的系统(netstat)并查看是否有进程正在侦听端口5555、5556、5557。或者您运行此程序两次,但忘记了第一次