04-线程参数及顺序
目标¶
-
能够向线程函数传递多个参数
-
能够说出多线程执行的顺序特点
1. 多线程中参数传递问题¶
改进sing函数,增加 a、b、c 三个参数
def sing(a, b, c):
print("----sing----a = %d, b = %d,c = %d" % (a, b, c))
for i in range(5):
print("正在唱歌...")
time.sleep(0.5)
传递参数的方法一:
使用args 传递参数
t1 = threading.Thread(target=sing, args=(10, 100, 100))
使用kwargs传递参数
t1 = threading.Thread(target=sing, kwargs={"a": 10, "b": 100, "c": 100})
同时使用 args 和 kwargs 传递参数
t1 = threading.Thread(target=sing, args=(10, ), kwargs={"b": 100, "c": 100})
注意,此处的 args = (10, ) 表示 传递一个元组
2. 线程的执行顺序¶
线程的调度是由CPU或者说操作系统根据当时的状态自行决定,所以多个线程的执行是无序的、随机的
import socket
import threading
import time
def sing():
for i in range(10):
print("------------------------------")
time.sleep(0.5)
def dance():
for i in range(10):
print("-----")
time.sleep(0.5)
if __name__ == '__main__':
# 创建两个子线程
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
# 启动子线程
t1.start()
t2.start()
执行结果:(运行的结果可能不一样,但是大体是一致的)
说明:
从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。
3. 总结¶
- 每个线程默认有一个名字,是python会自动为线程指定一个名字。
- 当线程的run()方法结束时该线程完成。
- 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。