首页 > 解决方案 > python多处理包装tornado.ioloop

问题描述

我对python的多重处理真的很陌生,我对异步调用、yield等有一些概念……最基本的东西。我来到这个片段,其中 multiprocessing.Process 环绕 tornado.ioloop.IOLoop.instance

    # Set up the tornado web app
    app = make_app(predicted_model_queue)
    app.listen(8080)
    server_process = Process(target=tornado.ioloop.IOLoop.instance().start)
    # Start up the server to expose the metrics.
    server_process.start()

它打算将tornado 服务器作为server_process 启动,但代码不起作用。我得到了错误,

OSError: [Errno 9] Bad file descriptor

我对这两个库都没有经验,也不知道如何修复它。谁能帮帮我吗?

标签: pythonmultiprocessingtornado

解决方案


这是一个不寻常的模式——如果你正在编写一个新的应用程序,我不建议你复制它。

如果您只是尝试运行执行此操作的应用程序(看起来它来自这里),问题是 IOLoops 无法安全地跨越进程边界(在某些平台上它有时可以工作,但并非总是如此)。要重写此代码以在子进程中正确创建应用程序和 IOLoop,您可以执行以下操作:

def run_server():
    app = make_app(predicted_model_queue)
    app.listen(8080)
    tornado.ioloop.IOLoop.current().start()
server_process = Process(target=run_server)
server_process.start()

这种方式只有predicted_model_queue在两个进程之间共享。


推荐阅读