2

我正在电子应用程序和 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()

每次从 javascript 端调用 ping() 时,它都会启动一个新进程来模拟一些工作(休眠 5 秒),并通过在 nodejs 服务器上调用 pong 来指示工作已完成。

问题是 pong() 请求永远不会到达 javascript 端。如果我没有生成一个新进程,而是使用 _thread 创建一个新线程并在 ping_response() 中执行相同的代码,那么 pong 请求就会到达 javascript 端。此外,如果我手动运行 bash 命令zerorpc tcp://localhost:4243 pong,我可以看到 nodejs 脚本收到了 pong 请求,因此 javascript 端的服务器工作正常。

当我创建一个新进程并且它无法发送请求时,zerorpc 客户端会发生什么?

谢谢你。

编辑 它似乎卡在 c.pong()

4

1 回答 1

0

尝试使用gipc.start_process()模块gipc(通过 pip)而不是multiprocessing.Process(). 它创建了一个新的 gevent 上下文,否则多处理将意外继承。

于 2019-02-26T03:16:40.243 回答