为什么运行多进程时firebase_admin无法解析

时间:2019-12-23 09:01:28

标签: python firebase multiprocessing tornado firebase-admin

我有一个使用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()无法得到解决。

有人知道它为什么会发生吗,或者至少我该如何调试它?

1 个答案:

答案 0 :(得分:0)

多进程派生程序(即start(4)调用)必须在应用程序生命中非常早地出现。特别是,大多数与网络相关的事物必须在分叉之后进行({bind()是为数不多的例外之一,在这种情况下,必须必须在分叉之前)。

您(可能)需要重新组织事情,以便在派生后创建Firebase应用程序。如果您使用的是HTTPServer.start方法,这可能会很烦人,所以您可能希望改为直接调用tornado.process.fork_processes()(这被记录为“高级多进程”模式)。