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)

image-20180613131446152

传递参数的方法一:

使用args 传递参数

t1 = threading.Thread(target=sing, args=(10, 100, 100))

image-20180613131642516

使用kwargs传递参数

t1 = threading.Thread(target=sing, kwargs={"a": 10, "b": 100, "c": 100})

image-20180613131835904

同时使用 args 和 kwargs 传递参数

t1 = threading.Thread(target=sing, args=(10, ), kwargs={"b": 100, "c": 100})

image-20180613160411364

注意,此处的 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()

执行结果:(运行的结果可能不一样,但是大体是一致的)

image-20180629231712298

说明:

从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。

3. 总结

  1. 每个线程默认有一个名字,是python会自动为线程指定一个名字。
  2. 当线程的run()方法结束时该线程完成。
  3. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。