Python导入firebase模块导致程序意外循环

时间:2017-06-08 09:59:09

标签: python-2.7 firebase

我使用的是Python2.7,Python-firebase 1.2。

如果我们对firebase导入进行评论,那么它只给出一次输出,否则它会给出多次。

from firebase import firebase

print "result"

输出:

result
result
result
result

1 个答案:

答案 0 :(得分:1)

那个firebase模块是由坏程序员编写的,因为它执行的是你没有明确要求的任务。出于这个原因,我会建议任何人避免使用该模块,因为你不知道他们的代码中可能有什么其他诱杀陷阱。当然,他们可能认为这种行为很方便,但方便就是一切,但打破了程序员的期望(绝对是每个模块作者必须遵循的规则),如果方便,这个问题就不存在了。他们确实说它很大程度上依赖于多处理,但他们没有提到你不会有发言权:

  

当并发进入时,接口在很大程度上依赖于标准的多处理库。在创建异步调用时,会创建一个按需进程池,并且异步方法由池中的一个空闲进程执行。在主进程终止之前,池仍然存在。因此,每次触发异步调用时,始终使用相同的池。当方法返回时,池进程将返回值返回给提供的回调函数中的主进程。

所以,所有这一切......这是因为该模块的主要__init__.py导入其async.py模块,而该模块又创建了multiprocessing.Pool(设置为_process_pool 1}})有5个固定的插槽,没有给你任何工作,你得到了main脚本的5个额外进程 - 因此,它打印出result 6次(主进程和5个生成的子进程) -processes)。

底线 - 不要使用此模块。还有其他选择,但如果您必须 - 使用主流程检查来保护您的代码:

if __name__ == "__main__":
    print("result")

它仍然会产生5个子进程,并等待所有这些进程完成(这很快),但至少它不会执行你看守的代码。