python zerorpc и проблема многопроцессорности - PullRequest
0 голосов
/ 01 сентября 2018

Я реализую двунаправленное демонстрационное приложение для пинг-понга между электронным приложением и бэкэндом Python.

Это код для части Python, которая вызывает проблемы:

import sys
import zerorpc
import time
from multiprocessing import Process

def ping_response():
    print("Sleeping")
    time.sleep(5)
    c = zerorpc.Client()
    c.connect("tcp://127.0.0.1:4243")
    print("sending pong")
    c.pong()

class Api(object):    
    def echo(self, text):
        """echo any text"""
        return text

    def ping(self):

        p = Process(target=ping_response, args=())
        p.start()
        print("got ping")
        return

def parse_port():
    port = 4242
    try:
        port = int(sys.argv[1])
    except Exception as e:
        pass
    return '{}'.format(port)

def main():
    addr = 'tcp://127.0.0.1:' + parse_port()
    s = zerorpc.Server(Api())
    s.bind(addr)
    print('start running on {}'.format(addr))
    s.run()

if __name__ == '__main__':
    main()

Каждый раз, когда ping () вызывается со стороны javascript, он запускает новый процесс, имитирующий некоторую работу (спящий в течение 5 секунд), и отвечает, вызывая pong на сервере nodejs, чтобы указать, что работа выполнена.

Проблема в том, что запрос pong () никогда не переходит на сторону javascript. Если вместо порождения нового процесса я создаю новый поток с помощью _thread и выполняю тот же код в ping_response (), запрос pong приходит на стороне javascript. Также, если я вручную запускаю команду bash zerorpc tcp://localhost:4243 pong, я вижу, что запрос pong получен сценарием nodejs, поэтому сервер на стороне javascript работает нормально.

Что происходит с клиентом zerorpc, когда я создаю новый процесс, и ему не удается отправить запрос?

Спасибо.

EDIT Кажется, он застревает в c.pong ()

1 Ответ

0 голосов
/ 26 февраля 2019

Попробуйте использовать gipc.start_process() из модуля gipc (через пункт) вместо multiprocessing.Process(). Это создает новый контекст gevent, который в противном случае мультипроцессорное наследование будет случайно наследовать.

...