Я реализую двунаправленное демонстрационное приложение для пинг-понга между электронным приложением и бэкэндом 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 ()