2013-02-05 45 views
1
方法

我的设置如下 - 我有一个几乎是“Hello World”示例基于龙卷风HTTP服务器:调用另一个进程的Python中

server = tornado.httpserver.HTTPServer(app) 
server.bind(8888) 
server.start(2) 
tornado.ioloop.IOLoop.instance().start() 
在此设置

现在,我也有另一个进程(让我们称之为控制过程)由根进程产生。因此,这个控制过程是两个龙卷风处理程序的兄弟姐妹。当然,我可以通过由根进程创建的管道在处理程序进程和控制进程之间进行通信。然而,我更感兴趣的是调用一个控制过程的方法并获取它的输出。

做这样的事情的最佳方法是什么?如果我使用管道将处理程序的请求发送到控件并返回结果,我应该使用锁来实现过程安全吗?

回答

0

你不需要锁定管道。管道是它自己的同步。或者,换一种方式,管道的两侧是独立的物体。 (当然,控制进程可能需要一个内部锁,例如,如果它是从主事件循环以外的其他线程处理管道,并且需要与主循环中运行的代码共享任何数据,但那不是与进程间安全相关)。

无论如何,如果您退后一步并从更高级别考虑此问题,您要实现的是RPC机制的确切定义。如果你正在做的事情很简单,用这种方式从头开始实施它是可行的,但如果不是这样,你可能想要添加另一个协议到control,让Tornado和你现有的协议一起管理它。

+0

是的,它恰好是一个RPC。是的,我不知何故感到困惑,来自两个处理程序的两个输入和它们的输出可能混在一起(对我感到羞耻)。由于我对Tornado颇为新颖,你能否指定“为控制添加另一个协议”的含义? – dmg

+0

@DJV:我的意思是......无论你是什么意思,你在问题中使用了四次这个名字。你想要一些“处理程序”来提出反对“控制程序”的请求。所以,如果这个“控制过程”已经在使用Tornado来实现,例如,一个Web应用服务器或者一个JSON-RPC-over-sockets服务器或者其他任何东西,那么只需添加另一个协议供其他进程使用,而不是实现从头开始独立的东西。 – abarnert

相关问题