web-dev-qa-db-ja.com

Zeromqのinprocおよびipcトランスポートを使用するにはどうすればよいですか?

ZERMQの初心者です。 ZeroMQにはTCP、INPROC、IPCトランスポートがあります。Winx64でpython andinprocとpython 2.7、これはLinuxにも使用できます。

また、UDPの転送方法を探していましたが、例が見つかりませんでした。

私が見つけた唯一の例は

import zmq
import zhelpers

context = zmq.Context()

sink = context.socket(zmq.ROUTER)
sink.bind("inproc://example")

# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)

# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)

私が考えているユースケースは次のとおりです。情報の配布のようなUDP。 TCPを使用したプッシュ/プルのテストは高速であるか、inprocの方が高速です。

これがテスト例です>............。

サーバ:

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("inproc://example2")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message

    #  Do some 'work'
    time.sleep (1)        #   Do some 'work'

    #  Send reply back to client
    socket.send("World")

クライアント:

import zmq

context = zmq.Context()

#  Socket to talk to server
print "Connecting to hello world server..."
socket = context.socket(zmq.REQ)
socket.connect ("inproc://example2")

#  Do 10 requests, waiting each time for a response
for request in range (1,10):
    print "Sending request ", request,"..."
    socket.send ("Hello")

    #  Get the reply.
    message = socket.recv()
    print "Received reply ", request, "[", message, "]"

エラーメッセージ:

 socket.connect ("inproc://example2")
File "socket.pyx", line 547, in zmq.core.socket.Socket.connect (zmq\core\socket.c:5347)
zmq.core.error.ZMQError: Connection refused
17
Merlin

私の知る限り、UDPは0MQではサポートされていません。また、IPCは、名前付きパイプのPOSIX準拠の実装があるOSでのみサポートされます。したがって、Windowsでは、実際には「inproc」、TCP、またはPGMのみを使用できます。ただし、上記の場合そして、これらすべてを超えて、0MQの主な機能の1つは、プロトコルがアドレスの一部にすぎないことです。任意の例を挙げて、ソケットアドレスを変更しても、すべてが正常に機能するはずです(もちろん、前述の条件に従います)。また、 ZGuide には多くの例があります(そのうちのかなりの数が Python で利用可能です)。

14
pblasucci

そして )の場合、ZMQ_PUBまたはZMQ_SUBソケットを使用します-これは、ROUTER、XREQなどを使用する例では使用しません-UDP、またはより正確には使用できます、UDPマルチキャスト経由

「epgm:// Host:port」

EPGMはEncapsulated PGMの略です。つまり、 [〜#〜] pgm [〜#〜] UDPでカプセル化され、生のPGMよりも既存のネットワークインフラストラクチャとの互換性が高くなります。

参照 http://api.zeromq.org/2-1:zmq-pgm

ただし、ユニキャストシナリオでのUDPサポートについては知りません。

9

ZeroMQは、2016年3月の時点でスレッドセーフなUDPをサポートしています。

  • ラジオ/ディッシュパターンを使用する必要があります(Pub/Subと非常によく似ています)
  • Libzmqおよびczmqでサポートされています
  • 見る tests/test_udp.cpptests/test_radio_dish.cpplibzmqソースコード内
  • Zeromq-dev @リストスレッドでDoronSomechによって提供された完全な内訳: スレッドセーフなPub/Subおよびマルチキャスト
5
Hitster GTD

Pyzmqとzmqのバージョンが古いバージョンの場合も同じ問題が発生しました。バージョンを15.2.0にアップグレードしてから問題を解決しました。使用した、ipcアドレスプレフィックスは「inproc://」です。

os:win7-x64 python:2.7.6

0
Greling