ZeroMQ: Как расставить приоритеты сокетов в методе .poll()?Python

Программы на Python
Anonymous
ZeroMQ: Как расставить приоритеты сокетов в методе .poll()?

Сообщение Anonymous »

Представьте себе следующий код:

Код: Выделить всё

import threading, zmq, time

context = zmq.Context()
receivers = []
poller = zmq.Poller()

def thread_fn(number: int):
sender = context.socket(zmq.PUSH)
sender.connect("tcp://localhost:%d" % (6666 + number))
for i in range(10):
sender.send_string("message from thread %d" % number)

for i in range(3):
new_receiver = context.socket(zmq.PULL)
new_receiver.bind("tcp://*:%d" % (6666 + i))
poller.register(new_receiver, zmq.POLLIN)
receivers.append(new_receiver)
threading.Thread(target=lambda: thread_fn(i), daemon=True).start()

while True:
try:
socks = dict(poller.poll())
except KeyboardInterrupt:
break

for i in range(3):
if receivers[i] in socks:
print("%d: process message %s" % (i, receivers[i].recv_string()))
time.sleep(0.2)  # 'process' the data
Потоки без перерыва отправляют некоторые сообщения, которые в случайном порядке поступают в соответствующие PULL-сокеты, где они «обрабатываются».

[/b] обычно вы подключаетесь к одному PULL-сокету, но в этом примере предполагается предоставить более одного принимающего сокета.

Вывод:

Код: Выделить всё

0: process message message from thread 0
1: process message message from thread 1
0: process message message from thread 0
1: process message message from thread 1
2: process message message from thread 2
0: process message message from thread 0
1: process message message from thread 1
2: process message message from thread 2
....
Теперь я хочу читать из всех сокетов, как в примере, но я бы хотел отдать приоритет одному сокету.

То есть: я хочу, чтобы результат был:

Код: Выделить всё

0: process message message from thread 0   

Подробнее здесь: [url]https://stackoverflow.com/questions/38633359/zeromq-how-to-prioritise-sockets-in-a-poll-method[/url]

Вернуться в «Python»