【问题标题】:pyzmq poller for both recv and send messages用于接收和发送消息的 pyzmq 轮询器
【发布时间】:2021-06-15 13:09:25
【问题描述】:

如果我同时向 POLLIN 和 POLLOUT 注册 pyzmq 轮询器,则它不起作用。 if 条件无法捕捉到 POLLIN 事件

server.py

​​>
import zmq
import random
import sys
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.bind("tcp://*:5556")


while True:
    socket.send(b"Server")

client.py

​​>
import zmq
import random
import sys
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.connect("tcp://localhost:5556")


poller = zmq.Poller()
poller.register(socket, zmq.POLLIN|zmq.POLLOUT)

while True:
    socks = dict(poller.poll(50))
    if socket in socks and socks[socket] == zmq.POLLIN:
        msg = socket.recv()
        print(msg)

【问题讨论】:

  • 不使用poller直接调用socket.recv()会发生什么?

标签: zeromq pyzmq


【解决方案1】:

zmq.POLLINzmq.POLLOUTzmq.POLLIN | zmq.POLLOUT 的整数值分别为 1、2 和 3:

>>> zmq.POLLIN, zmq.POLLOUT, zmq.POLLIN | zmq.POLLOUT
(1, 2, 3)

因此,如果在您的客户端,if 语句期望在套接字中接收,则它必须等待 zmq.POLLIN (1) 状态,但也要等待 zmq.POLLIN | zmq.POLLOUT (3) 状态,因为它们是独占的。

重写你的 if 语句:

if socket in socks and socks[socket] in (zmq.POLLIN, zmq.POLLIN | zmq.POLLOUT):
    # your code    
    ...

同理,如果要在套接字中发送,必须等待zmq.POLLOUT (2) 和zmq.POLLIN | zmq.POLLOUT (3) 状态。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多