2013-12-18 57 views
6

可能有些東西很小,但我無法使用官方Pyzmq軟件包(https://github.com/zeromq/pyzmq)獲得一個簡單的pub-sub示例。ZeroMQ PubSub不能正常工作w Pyzmq

我正在使用最新的ZeroMQ穩定版本4.0.3,並且能夠在c中很容易地獲得一個簡單的示例。我試過Mac和Ubuntu機器。我期待着在這個任何輸入;)

這裏是我的代碼:

sub.py

import zmq 

ctx = zmq.Context() 
s = ctx.socket(zmq.SUB) 
s.connect("tcp://127.0.0.1:5567") 
s.setsockopt(zmq.SUBSCRIBE,'') 

while True: 
    print 'waiting...' 
    msg = s.recv() 
    print 'received:', msg 

pub.py

import zmq 

ctx = zmq.Context() 
s = ctx.socket(zmq.PUB) 
s.bind("tcp://*:5567") 

for i in range(100): 
    s.send("test") 

回答

11

假設你啓動訂閱者,然後是發佈者,訂閱者會永遠嘗試連接到發佈者。當發佈者出現時,用戶端的連接過程需要一些時間,您的發佈者並不在意這一點。當它儘快發出消息時,用戶正試圖建立連接。當連接建立並且用戶準備好接收時,發佈者已經完成其工作。

解決方案:通過增加睡眠發行代碼給用戶一些時間:

import zmq 
import time 

ctx = zmq.Context() 
s = ctx.socket(zmq.PUB) 
s.bind("tcp://*:5567") 

time.sleep(1) 
for i in range(100): 
    s.send("test") 
+0

,就是這樣。謝謝! – Stephen

+2

然後,爲什麼C版本能夠正常工作,正如@Stephen所說的那樣?有沒有什麼辦法擺脫這種黑客攻擊,同時保留將許多發佈者連接到一個訂閱者的能力? (唉,沒有'zmq.PAIR') – Pastafarianist

+0

相當醜陋的解決方案:( – DataGreed