2013-12-18 11 views
6

Có lẽ có điều gì đó rất nhỏ mà tôi thiếu nhưng tôi không thể lấy một ví dụ pub-sub đơn giản làm việc bằng Python sử dụng gói Pyzmq chính thức (https://github.com/zeromq/pyzmq).ZeroMQ PubSub không hoạt động w Pyzmq

Tôi đang sử dụng bản phát hành ổn định ZeroMQ mới nhất 4.0.3 và có thể có được một ví dụ đơn giản hoạt động khá dễ dàng trong c. Tôi đã thử trên cả máy Mac và Ubuntu. Tôi mong muốn được bất kỳ đầu vào về vấn đề này;)

Dưới đây là mã của tôi:

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") 

Trả lời

11

Giả sử bạn khởi động người đăng ký trước và sau đó là nhà xuất bản, người đăng ký thường xuyên cố gắng kết nối với nhà xuất bản. Khi nhà xuất bản xuất hiện, quy trình kết nối ở phía bên thuê bao mất một thời gian và nhà xuất bản của bạn không thực sự quan tâm đến điều này. Trong khi nó cháy với tin nhắn càng sớm càng tốt, thuê bao đang cố gắng thiết lập kết nối. Khi kết nối được thiết lập và người đăng ký sẵn sàng nhận, nhà xuất bản đã hoàn thành công việc của mình.

Giải pháp: cung cấp cho thuê bao một thời gian bằng cách thêm giấc ngủ để mã nhà xuất bản:

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

Và đó là nó. Cảm ơn bạn! – Stephen

+2

Tại sao phiên bản C hoạt động sau đó, như @Stephen nói? Và có cách nào để loại bỏ hack này, trong khi vẫn duy trì khả năng kết nối nhiều nhà xuất bản với một người đăng ký không? (than ôi, không có 'zmq.PAIR') – Pastafarianist

+0

Giải pháp khá xấu: ( – DataGreed

Các vấn đề liên quan