我的设置如下 - 我有一个基于 Tornado 的 HTTP 服务器,它几乎就是“hello world”示例:
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
server.start(2)
tornado.ioloop.IOLoop.instance().start()
现在,在此设置中,我还有另一个由根进程生成的进程(我们称之为控制进程)。因此,这个控制进程是两个 Tornado 处理程序进程的兄弟。当然,我可以通过根进程创建的管道在处理程序进程和控制进程之间进行通信。然而,我更感兴趣的是调用控制过程的方法并获取它的输出。
做这样的事情最好的方法是什么?如果我使用管道将请求从处理程序发送到控件并返回结果,我是否应该使用锁来实现进程安全?
请您参考如下方法:
你不需要带管道的锁。管道是它自己的同步。或者,换句话说,管道的两侧是不同的对象。
(当然,控制进程可能需要内部锁,例如,如果它从与主事件循环不同的线程处理管道,并且需要与在主循环中运行的代码共享任何数据,但这无关紧要进程间安全。)
无论如何,如果你退后一步,从更高的层次来思考这个问题,你正在实现的是 RPC 机制的确切定义。如果您所做的事情足够简单,那么以这种方式从头开始实现就可以了,但如果不是,您可能希望将另一个协议(protocol)添加到 control 并让 Tornado 与您现有的协议(protocol)一起管理它(s).
