我有一个设置,我使用Tornado来处理Web请求和将任务排队到一堆Python进程。其中一个过程是控制过程,而其他过程是工作过程。我想实现一个功能,允许关闭,重启等服务器的计算部分。当Tornado作为单个进程运行时,这非常有效。但是,使用多个服务器进程时,即:
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
server.start(2)
tornado.ioloop.IOLoop.instance().start()
这会产生三个进程(一个控件和两个处理程序)。当我决定停止计算过程时,我收到一个错误:
AssertionError: can only join a child process
我将其解释为试图停止计算过程的Tornado处理程序进程,但Tornado控制一个是他们的父进程。
我正在考虑使用管道,因此我可以向控制计算过程发送停止消息,但是,再次出现了一个问题,即是否可以在2个处理程序进程之间共享管道端点?
作为第二个问题,我的方法/架构是完全错误的,什么是正确的方法/架构?
答案 0 :(得分:0)
我认为您需要提供更多示例代码来帮助AssertionError
。但基本上只有创建新线程或进程的线程才能加入它(如消息所示)。
关于Pipe
,你可以创建两个Pipes(每个子进程一个),因为一旦消息被一个读取,它将不可用于其他。可以在tornado.web.Handlers
与tornado.web.RequestHandler.settings
之间共享项目。
但是,请记住为请求创建了一个Handler。但听起来你可能正在使用它们进行后台处理?如果是这种情况,您可以简单地与他们共享一个队列并“毒害”它。