0

私は 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

特に単体テストでは発生しないため、なぜこれが発生するのかわかりません。誰でも光を当てることができますか?

4

1 に答える 1

1

一般に、このタイプの「使用中のアドレス」エラーが発生した場合は、プログラムが 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 でリッスンしているプロセスがあるかどうかを確認します。または、このプログラムを 2 回実行していて、最初のプログラムを忘れている可能性があります。

于 2013-11-03T01:34:05.803 に答える