0

我有一个设置,我使用 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 个处理程序进程之间共享?

作为第二个问题,我的方法/架构是否完全错误,什么是正确的方法/架构?

4

1 回答 1

0

我认为您需要包含更多示例代码来帮助AssertionError. 但基本上只有创建新线程或进程的线程才能加入它(如消息所示)。

关于Pipes,您可以创建两个管道(每个子流程一个),因为一旦消息被一个读取,其他管道将无法使用。项目可以在 之间tornado.web.Handlers共享tornado.web.RequestHandler.settings

但是,请记住,处理程序是为请求创建的。但听起来您可能正在使用它们进行后台处理?如果是这种情况,您可以简单地与他们共享一个队列并“毒化”它。

于 2013-02-19T19:37:33.943 回答