我使用的是Python2.7,Python-firebase 1.2。
如果我们对firebase导入进行评论,那么它只给出一次输出,否则它会给出多次。
from firebase import firebase
print "result"
输出:
result
result
result
result
答案 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个子进程,并等待所有这些进程完成(这很快),但至少它不会执行你看守的代码。