Как использовать pyzmq для связи между родительским процессом и дочерним процессом? - PullRequest
0 голосов
/ 10 января 2019

Я создаю дочерний процесс с использованием многопроцессорной обработки Python. Родитель будет создавать сокет как zmq.PUB. Ребенок будет подписываться на эту розетку. Но проблема в том, что ребенок не получает никакого сообщения.

Этот код работает в Windows. Но когда я пытаюсь использовать RHEL 7.5, он не работает.

import multiprocessing
import zmq
import os
import time

port = '5555'


def child():
    print("Child pid: ", os.getpid())
    context = zmq.Context.instance()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, str.encode(''))
    socket.connect("tcp://localhost:%s" % port)
    poller = zmq.Poller()
    poller.register(socket, zmq.POLLIN)
    socks = dict(poller.poll())
    while (True):
        for key, value in socks.items():
            print(key, " ", value)
        time.sleep(5)
        print('receiving data')
        if socket in socks and socks[socket] == zmq.POLLIN:
            try:
                string = socket.recv_string(flags=zmq.NOBLOCK)
            except (zmq.error.Again, Exception) as e:
                break
        print('data received: ', string)


def main():
    print("Parent pid: ", os.getpid())
    context = zmq.Context.instance()
    socket = context.socket(zmq.PUB)
    socket.bind("tcp://*:%s" % port)
    childproc = multiprocessing.Process(name='childproc',target=child)
    childproc.daemon = False
    childproc.start()
    while (True):
        print('data publishing')
        socket.send_string("hello")
        time.sleep(5)

В окнах результат:

Parent pid:  5536
data publishing
Child pid:  13964
data publishing
<zmq.sugar.socket.Socket object at 0x000001E5BB6B3BA8>   1
data publishing
receiving data
data received:  hello
<zmq.sugar.socket.Socket object at 0x000001E5BB6B3BA8>   1
data publishing
receiving data
data received:  hello
......
......
В Linux вывод такой:
Parent pid:  21850
data publishing
Child pid:  21854
data publishing
data publishing
data publishing
data publishing
data publishing
data publishing
data publishing
..........
..........
Это проблема с использованием PUB / SUB? Как я могу использовать ZMQ для общения между родителями и детьми? Если ZMQ не поддерживает это, какую другую библиотеку можно использовать вместо этого? Если я использую очередь и каналы из многопроцессорного модуля, какие могут быть проблемы, если сообщения являются объектами JSON?
...