十二、多线程编程

1. 多线程概述

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每一个运行中的程序就是一个进程。当一个程序运行时,内部可能包含多个顺序执行流,每一个顺序执行流就是一个线程。

前面所有的学习实例都是单线程的,同一时刻,只能执行一个代码,如果遇到阻塞或者异常,则整个项目都停止了。

可以这样理解: 单线程的程序如同只雇佣一个服务员的餐厅,他必须做完一件事情后才可以做下一件事情; 而多线程的程序则如同雇佣多个服务员的餐厅,他们可以同时做多件事情。

这个是重要的物理区别。

image-20240726145655350

image-20240726145803062

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()
最近一次更新 3/20/2025, 7:54:12 AM