十二、多线程编程
1. 多线程概述
几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每一个运行中的程序就是一个进程。当一个程序运行时,内部可能包含多个顺序执行流,每一个顺序执行流就是一个线程。
前面所有的学习实例都是单线程的,同一时刻,只能执行一个代码,如果遇到阻塞或者异常,则整个项目都停止了。
可以这样理解: 单线程的程序如同只雇佣一个服务员的餐厅,他必须做完一件事情后才可以做下一件事情; 而多线程的程序则如同雇佣多个服务员的餐厅,他们可以同时做多件事情。
这个是重要的物理区别。2. 通过threading模块实现多线程
我们可以使用threading模块的Thread类的构造器来创建线程
def _ init _(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None):
上面的构造器涉及如下几个参数:
- group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为None。
- target:指定该线程要调度的目标方法。
- name:线程名称,一般不用设置
- args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target函数的第一个参数,元组的第二个元素传给target函数的第二个参数……依此类推。
- kwargs:指定一个字典,以关键字参数的形式为target 指定的函数传入参数。
- daemon:指定所构建的线程是否为后代线程。
我们看下实例:
import time
def wishing():
while True:
print("洗菜菜...啦啦啦")
time.sleep(1)
def cooking():
while True:
print("烧饭,烧菜...啦啦啦")
time.sleep(1)
if __name__ == '__main__':
wishing()
cooking()
运行输出的,一直是:洗菜菜...啦啦啦
如果我们不用多线程,无法实现两个任务一起执行。
我们使用多线程实现代码:
import time
import threading
def wishing():
while True:
print("洗菜菜...啦啦啦\n")
time.sleep(1)
def cooking():
while True:
print("烧饭,烧菜...啦啦啦\n")
time.sleep(1)
if __name__ == '__main__':
thread_wishing = threading.Thread(target=wishing)
thread_cooking = threading.Thread(target=cooking)
# 启动线程
thread_cooking.start()
thread_wishing.start()
传参:
import threading
import time
def wishing(msg):
while True:
print(msg)
time.sleep(1)
def cooking(msg):
while True:
print(msg)
time.sleep(1)
if __name__ == '__main__':
# 创建洗菜线程
thread_wish = threading.Thread(target=wishing, args=("洗菜...",))
thread_cook = threading.Thread(target=cooking, kwargs={"msg": "煮饭、煮菜。。。"})
# 启动线程
thread_wish.start()
thread_cook.start()