我有一个使用Python firebase_admin SDK的Tornado应用程序。 当我在单个进程中运行时:
console_server = tornado.httpserver.HTTPServer(ConsoleApplication())
console_server.listen(options.console_port, options.bind_addr)
tornado.ioloop.IOLoop.instance().start()
firebase_admin工作正常。但是当我更改它以在多进程中运行时:
console_server = tornado.httpserver.HTTPServer(ConsoleApplication())
console_server.bind(options.console_port, options.bind_addr)
console_server.start(4)
tornado.ioloop.IOLoop.instance().start()
这里的最后一行被卡住了:
if (not len(firebase_admin._apps)):
cred = ...
self.app = firebase_admin.initialize_app(cred)
self.app = firebase_admin.get_app()
self.db = firestore.client()
...
ref = self.db.document(USER_DOC.format(org, value))
user_ref = ref.get()
由于我没有收到任何异常,因此好像get()无法得到解决。
有人知道它为什么会发生吗,或者至少我该如何调试它?
答案 0 :(得分:0)
多进程派生程序(即start(4)
调用)必须在应用程序生命中非常早地出现。特别是,大多数与网络相关的事物必须在分叉之后进行({bind()
是为数不多的例外之一,在这种情况下,必须必须在分叉之前)。
您(可能)需要重新组织事情,以便在派生后创建Firebase应用程序。如果您使用的是HTTPServer.start
方法,这可能会很烦人,所以您可能希望改为直接调用tornado.process.fork_processes()
(这被记录为“高级多进程”模式)。