Python导入模块触发死循环成因及运行中方法取返回值问询
问题解答
1. 现象成因
Python导入任意模块时,会按顺序执行该模块内所有无缩进的顶层代码,而非仅加载函数、类的定义。你提供的checkapi.py最后一行是直接调用loop()的无保护代码,没有设置执行条件限制,因此当apicheck.py执行import checkapi时,解释器会直接触发loop()运行。
而loop()是没有退出条件的死循环,会持续占用当前执行线程,导致模块导入逻辑永远无法结束,自然跑不到apicheck.py里后续调用add、打印返回值的代码,就出现了仅持续输出loop running的现象。
2. 解决方法
分两种场景处理:
场景1:无需在apicheck.py中运行loop,仅需调用add方法
给checkapi.py的顶层执行代码加if __name__ == "__main__"保护即可,该语法的作用是:仅当直接运行checkapi.py脚本时才会执行块内代码,被其他模块导入时不会执行,修正后代码如下:
# checkapi.py 修正版 import time def add(a,b): return a + b def loop(): while True: time.sleep(10) print("loop running") # 仅直接运行当前脚本时才启动loop if __name__ == "__main__": loop()
修正后直接运行原apicheck.py,就能正常打印add方法的返回值11。
场景2:需要在apicheck.py中同时运行loop、调用add方法
由于loop是死循环,单线程下运行loop会阻塞其他逻辑,因此需要用多线程/多进程将loop放到独立的执行流中,避免阻塞主线程,以线程实现为例,apicheck.py代码如下:
# apicheck.py 多线程版 import checkapi import threading # 新建独立线程运行loop,daemon=True表示主线程退出时该线程自动销毁 loop_thread = threading.Thread(target=checkapi.loop, daemon=True) loop_thread.start() # 主线程正常调用add方法获取返回值 print(checkapi.add(5, 6))
运行上述代码后,会先打印add的返回值11,之后后台线程每隔10秒打印一次loop running,两个需求可同时满足。如果是CPU密集型任务,也可以将线程替换为多进程实现,逻辑一致。
内容的提问来源于stack exchange,提问作者user17293704
相关产品推荐
相关产品推荐

