2013-08-07 80 views
34

Tôi nhầm lẫn với những gì poller thực sự làm trong zmq. Các zguide đi vào nó tối thiểu, và chỉ mô tả nó như một cách để đọc từ nhiều ổ cắm. Đây không phải là một câu trả lời thỏa mãn cho tôi bởi vì nó không giải thích làm thế nào để có các khe cắm thời gian chờ. Tôi biết zeromq: how to prevent infinite wait? giải thích cho việc đẩy/kéo, nhưng không mô hình hóa lại/đại diện, đó là những gì tôi muốn biết cách sử dụng.Zmq poller hoạt động như thế nào?

Điều tôi đang cố hỏi là: Poller hoạt động như thế nào và chức năng của nó áp dụng như thế nào để theo dõi các ổ cắm và các yêu cầu của chúng?

+0

Bạn có thể nêu rõ hơn những câu hỏi cụ thể của mình không? – xaxxon

Trả lời

49

Khi bạn cần phải lắng nghe trên ổ cắm khác nhau trong cùng một thread, sử dụng một poller:

ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB) 
ZMQ.Socket puller = ctx.socket(ZMQ.PULL) 

socket ký với poller (POLLIN lắng nghe cho các tin nhắn đến)

ZMQ.Poller poller = ZMQ.Poller(2) 
poller.register(subscriber, ZMQ.Poller.POLLIN) 
poller.register(puller, ZMQ.Poller.POLLIN) 

Khi bỏ phiếu, sử dụng vòng lặp:

while(notInterrupted()){ 
    poller.poll() 

    //subscriber registered at index '0' 
    if(poller.pollin(0)) 
    subscriber.recv(ZMQ.DONTWAIT) 

    //puller registered at index '1' 
    if(poller.pollin(1)) 
    puller.recv(ZMQ.DONTWAIT) 
} 

Chọn cách bạn muốn thăm dò ý kiến ​​...

poller.poll() khối cho đến khi có dữ liệu trên ổ cắm.
poller.poll(1000) khối trong 1 giây, sau đó hết giờ.

Poller thông báo khi có dữ liệu (tin nhắn) có sẵn trên ổ cắm; đó là công việc của bạn để đọc nó.

Khi đọc, hãy thực hiện mà không chặn: socket.recv(ZMQ.DONTWAIT). Mặc dù poller.pollin(0) kiểm tra xem có dữ liệu để đọc hay không, bạn muốn tránh bất kỳ cuộc gọi chặn nào bên trong vòng lặp bỏ phiếu, nếu không, bạn có thể sẽ chặn poller do ổ cắm bị kẹt.

Vì vậy, nếu hai thông điệp riêng biệt được gửi đến subscriber, bạn phải gọi subscriber.recv() hai lần để xóa poller, nếu không, nếu bạn gọi subscriber.recv() một lần, các poller sẽ luôn nói với bạn có một thông báo để được đọc. Vì vậy, về bản chất, các poller theo dõi sự sẵn có và số lượng tin nhắn, không phải là thông điệp thực tế.

Bạn nên chạy qua các ví dụ bỏ phiếu và chơi với mã, đó là cách tốt nhất để tìm hiểu.

Điều đó có trả lời câu hỏi của bạn không?

+1

Đó chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn. – user1876508

+0

Làm thế nào chúng ta có thể biết bao nhiêu lần chúng ta nên gọi 'subscriber.recv()' để xóa poller? – Meysam