【问题标题】:Tornado: Pre-forking with unix socketsTornado:使用 unix 套接字进行预分叉
【发布时间】:2014-06-19 19:43:19
【问题描述】:

使用 Tornado Web 服务器,我尝试在绑定到 unix 套接字后使用他们的 pre-fork,但我收到以下错误:

RuntimeError:无法在多个进程中运行:IOLoop 实例已被初始化。在调用 start_processes() 之前不能调用 IOLoop.instance()

绑定 unix 套接字并使用时,tornado 是否有原因引发此问题:

myserver.start(0) 与使用 TCP 端口?

【问题讨论】:

    标签: python webserver tornado


    【解决方案1】:

    该错误与 unix 套接字无关。 IOLoops 不能优雅地在分叉中存活,因此如果要分叉,则必须在初始化任何全局 IOLoop 之前(但在绑定任何套接字之后)进行。一般来说,在分叉之前必须尽可能少做,因为许多 Tornado 组件会隐式启动 IOLoop。如果您使用多个 TCPServer,请确保仅从您开始的第一个分叉;所有其他人都应该处于单进程模式。

    【讨论】:

    • 如果您尝试使用 Motor Mongo 驱动程序,那么您会发现它不支持这种操作模式。或者您可能会发现您需要禁用调试模式。
    【解决方案2】:

    如果您在应用程序初始化中设置了 debug=True,您可能会遇到此错误。例如:

    app = tornado.web.Application(handlers=[
    .
    .
    ],
    debug=True)
    

    因为它自动启用了与分叉不兼容的 autoreload=True。因此,要解决此问题,您还需要在应用程序初始化中设置 autoreload=False。

    app = tornado.web.Application(handlers=[
    .
    .
    ],
    debug=True, autoreload=False)
    

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2013-04-09
      相关资源
      最近更新 更多