Python多线程运行异常 仅持续输出a函数运行信息 打印不符合预期
多线程无法按预期调度运行的问题
尝试实现多线程功能时始终无法正常运行,将问题逻辑简化后,线程依然无法按预期正常打印,因此推测线程并未被正确调度执行。
复现代码
import time, threading s_print_lock = threading.Lock() def s_print(*a, **b): with s_print_lock: print(*a, **b) # 线程安全打印函数 def a(): while True: s_print('\'a\' is running') time.sleep(5) # 线程1执行逻辑 def b(): while True: s_print('\'b\' is running') time.sleep(5) # 线程2执行逻辑 if __name__ == "__main__": t1 = threading.Thread(target=a()) t2 = threading.Thread(target=b()) t1.start() t2.start()
实际输出表现
程序启动后只会无限循环输出a的运行日志,完全没有b线程的相关打印内容:
'a' is running 'a' is running 'a' is running 'a' is running ...
问题根因
threading.Thread的target参数需要传入可调用的函数对象本身,不能传入函数执行后的返回值- 当前代码中
target=a()、target=b()的写法,会在主线程走到创建t1这行代码时,直接同步调用a()函数:由于a()内部是无限循环,主线程会直接卡在这个循环里,根本执行不到后续创建t2、调用线程start()方法的步骤,自然永远只有a的循环输出。
修正方法
创建线程时去掉目标函数后面的调用括号,直接传入函数对象即可:
if __name__ == "__main__": t1 = threading.Thread(target=a) t2 = threading.Thread(target=b) t1.start() t2.start()
修改完成后,两个线程就会被正常调度,按预期间隔打印各自的运行日志。
内容的提问来源于stack exchange,提问作者J. Brosch
相关产品推荐
相关产品推荐

