一. 课程安排

  • 课程内容
    • 多任务基本介绍
    • 主线程和子线程的执行关系
    • 查看线程数量
    • 验证子线程的执行和创建
    • 线程间的通信

二. 课堂笔记

1. 多任务基本介绍

有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的

1.1 程序中模拟多任务

  1. import time
  2. def sing():
  3. for i in range(3):
  4. print("正在唱歌...%d"%i)
  5. time.sleep(1)
  6. def dance():
  7. for i in range(3):
  8. print("正在跳舞...%d"%i)
  9. time.sleep(1)
  10. if __name__ == '__main__':
  11. sing()
  12. dance()

2. 主线程和子线程的执行关系

  • 主线程会等待子线程结束之后在结束
  • join() 等待子线程结束之后,主线程继续执行
  • setDaemon() 守护线程,不会等待子线程结束
  1. import threading
  2. import time
  3. def demo():
  4. # 子线程
  5. print("hello girls")
  6. time.sleep(1)
  7. if __name__ == "__main__":
  8. for i in range(5):
  9. t = threading.Thread(target=demo)
  10. t.start()

3. 查看线程数量

  1. threading.enumerate() 查看当前线程的数量

4. 验证子线程的执行与创建

当调用Thread的时候,不会创建线程。
当调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及开始运行这个线程。

继承Thread类创建线程

  1. import threading
  2. import time
  3. class A(threading.Thread):
  4. def __init__(self,name):
  5. super().__init__(name=name)
  6. def run(self):
  7. for i in range(5):
  8. print(i)
  9. if __name__ == "__main__":
  10. t = A('test_name')
  11. t.start()

5. 线程间的通信(多线程共享全局变量)

在一个函数中,对全局变量进行修改的时候,是否要加global要看是否对全局变量的指向进行了修改,如果修改了指向,那么必须使用global,仅仅是修改了指向的空间中的数据,此时不用必须使用global
线程是共享全局变量

5.1 多线程参数-args

  1. threading.Thread(target=test, args=(num,))