龙卷风:使用unix套接字的预先分叉
我在使用Tornado Web Server的时候,想要在绑定到一个unix套接字后使用它的预先分叉功能,但遇到了以下错误:
运行时错误:无法在多个进程中运行:IOLoop实例已经初始化。你不能在调用start_processes()之前调用IOLoop.instance()。
为什么在绑定unix套接字并使用:
myserver.start(0)
时,tornado会出现这个问题,而使用TCP端口时却没有呢?
2 个回答
0
如果你在应用程序初始化时设置了debug=True,就可能会遇到这个错误。例如:
app = tornado.web.Application(handlers=[
.
.
],
debug=True)
因为它会自动启用autoreload=True,而这个设置和分叉(forking)是不兼容的。所以,要解决这个问题,你还需要在应用程序初始化时把autoreload设置为False。
app = tornado.web.Application(handlers=[
.
.
],
debug=True, autoreload=False)
1
这个错误和unix套接字没有关系。IOLoops在进行fork操作时不会很好地工作,所以如果你要进行fork,必须在初始化任何全局的IOLoop之前进行(但要在绑定任何套接字之后)。一般来说,在fork之前你要尽量少做事情,因为很多Tornado的组件会自动启动IOLoop。如果你使用多个TCP服务器,确保只从你启动的第一个服务器进行fork;其他的服务器应该保持在单进程模式下。