You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 06:36:02