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
相关产品推荐
相关产品推荐

