Hướng dẫn zmq send multipart python - zmq gửi python nhiều phần

Trong Python, tôi cũng đang tạo một ứng dụng sử dụng Zeromq. Tôi đang sử dụng phương thức đẩy/kéo để gửi trạng thái tải của một tập lệnh sang một tập lệnh khác. Thông báo nhận được trên tập lệnh kéo chạy bên trong một luồng. Kịch bản kéo trông như thế này:

import time
from threading import Thread
import threading
import os
import zmq
import sys

context = zmq.Context()
zmqsocket = context.socket(zmq.PULL)
zmqsocket.bind("tcp://*:5555")

class TaskstatusUpdater(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        while True:
                #  Wait for next request from client
                task_id = int(zmqsocket.recv_multipart()[0])
                taskcolorstat = int(zmqsocket.recv_multipart()[1])
                taskstatus = zmqsocket.recv_multipart()[2]
                time.sleep(0.1)
                print(task_id, taskstatus, taskcolorstat)

thread = TaskstatusUpdater()
thread.start()

Phần đẩy gửi liên tục cập nhật về trạng thái của tập lệnh khác. Nó trông giống như thế này:

import time
import sys
import zmq

# zmq - client startup and connecting

try:
    context = zmq.Context()
    print("Connecting to server…")
    zmqsocket = context.socket(zmq.PUSH)
    zmqsocket.connect("tcp://localhost:5555")
    print("succesful")
except:
    print('error could not connect to service')

# zmq - client startup and connecting

for i in range(10):
    zmqsocket.send_multipart([b_task_id, b"0", b"first message"])
    time.sleep(3)# doing stuff
    zmqsocket.send_multipart([b_task_id, b"1", b"second message"])

B_TASK_ID được tạo sớm hơn trong chương trình và là một giá trị nhị phân đơn giản được tạo ra từ một số nguyên. Có nhiều trong số các tập lệnh đẩy đó chạy cùng một lúc và thông qua b_task_id tôi có thể xác định tập lệnh nào đang trả lời kéo.

Bây giờ thường là trường hợp các thông điệp đa điểm đó bị lẫn lộn với nhau. Ai đó có thể giải thích cho tôi tại sao và làm thế nào tôi có thể khắc phục vấn đề này? Ví dụ, đôi khi đầu ra là:

2 b'second message' 0

Đầu ra mà tôi đang mong đợi là:

2 b'second message' 1

Gửi/nhận tin nhắn đa điểm bằng pyzmq

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

# Multipart_pub.py
Nhập khẩu zmq
nhập khẩu time
host="127.0.0.1" = "127.0.0.1"
port="5001" = "5001"
# Tạo một thể hiện ổ cắm
bối cảnh = zmq.context () = zmq.Context()
Ổ cắm = bối cảnh.socket (zmq.pub) = context.socket(zmq.PUB)
# Liên kết ổ cắm với một cổng được xác định trước trên localhost
socket.bind ("tcp: // {}: {}" .format (host, port)).bind("tcp://{}:{}".format(host, port))
thời gian.s ngủ (1).sleep(1)
# Gửi tin nhắn nhiều phần
socket.send_multipart ([b "ml", b "xin chào"])).send_multipart([b"ML", b"hello"])

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây.Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn.Tìm hiểu thêm về các ký tự unicode hai chiều

# Multipart_sub.py
Nhập khẩu zmq
host="127.0.0.1" = "127.0.0.1"
port="5001" = "5001"
# Tạo một thể hiện ổ cắm
bối cảnh = zmq.context () = zmq.Context()
Ổ cắm = bối cảnh.socket (zmq.pub) = context.socket(zmq.SUB)
# Liên kết ổ cắm với một cổng được xác định trước trên localhost
socket.bind ("tcp: // {}: {}" .format (host, port)).connect("tcp://{}:{}".format(host, port))
thời gian.s ngủ (1)
# Gửi tin nhắn nhiều phần.subscribe("ML")
socket.send_multipart ([b "ml", b "xin chào"]))
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây.Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn.Tìm hiểu thêm về các ký tự unicode hai chiều(socket.recv_multipart())