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

Python多线程传递参数时程序为何顺序执行?

问题原因

你创建线程时犯了一个关键错误:直接调用了目标函数,而不是传递函数本身。

当你写threading.Thread(target=sleepy_duck("Johny"))时,Python会先执行sleepy_duck("Johny"),等这个函数完全运行结束(包括sleep的1秒),才会把函数的返回值(这里是None)传给Thread的target参数。这就导致三个函数按顺序同步执行,根本没启动多线程。

修正方法

创建线程时,target要传函数对象(也就是不带括号的函数名),函数的参数通过args或kwargs参数传递:

  • args:以元组形式传递位置参数,单个参数的元组要加逗号(比如("Johny",))
  • kwargs:以字典形式传递关键字参数(比如{"name": "Johny"})

修正后的代码

import time
import threading

start = time.perf_counter()

def sleepy_duck(name):
    print(name, "duck going to sleep 1 sec")
    time.sleep(1)
    print(name, "waking up")    

# 用args传递参数,target传函数名
t1 = threading.Thread(target=sleepy_duck, args=("Johny",))
t2 = threading.Thread(target=sleepy_duck, args=("Dicky",))
t3 = threading.Thread(target=sleepy_duck, args=("Loly",))

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

finish = time.perf_counter()
print("The ducks slept ", finish-start, " seconds.")

预期运行结果(线程调度顺序可能略有不同)

Johny duck going to sleep 1 sec
Dicky duck going to sleep 1 sec
Loly duck going to sleep 1 sec
Johny waking up
Dicky waking up
Loly waking up
The ducks slept  1.0123456  seconds.

修正后三个线程会几乎同时启动,总耗时接近1秒,而非原来的3秒。

内容的提问来源于stack exchange,提问作者human374

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:54:18