簡體   English   中英

馬戲團/ ZeroMQ“套接字正在使用”錯誤

[英]Circus/ZeroMQ “socket in use” error

我正在運行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指定的端口號存在沖突。 從馬戲源代碼中,我看到了這些常量:

DEFAULT_ENDPOINT_DEALER =“ tcp://127.0.0.1:5555” DEFAULT_ENDPOINT_SUB =“ tcp://127.0.0.1:5556” DEFAULT_ENDPOINT_STATS =“ tcp://127.0.0.1:5557”

檢查您的系統(netstat),查看是否有任何進程在端口5555、5556、5557上進行偵聽。也許您正在運行此程序兩次,卻忘記了第一個程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM