前言
在之前的文章中,我们分别学习了python的多进程,协程。在langchain-chatchat里同时还运用了python的多线程模块。例如:
如上图代码所示,在Python中,使用threading模块可以实现多线程。通过创建线程对象,我们可以在不同的线程中执行不同的任务,并且这些线程可以同时运行,而不是按照顺序执行。
一、先看示例代码
让我们来看下面的代码示例,来了解如何在Python中使用多线程。
import threading
import time
# 定义工作函数,模拟线程工作
def worker(name, delay):
print(f"Worker {name} started") # 打印工作开始信息
time.sleep(delay) # 模拟工作延迟
print(f"Worker {name} finished") # 打印工作结束信息
if __name__ == '__main__':
# 创建线程1,目标为worker函数,参数为("Thread 1", 2),并设置为守护线程
t1 = threading.Thread(target=worker, args=("Thread 1", 2), daemon=True)
t1.start() # 启动线程1
# 创建线程2,目标为worker函数,参数为("Thread 2", 3),并设置为守护线程
t2 = threading.Thread(target=worker, args=("Thread 2", 3), daemon=True)
t2.start() # 启动线程2
print("Main thread started") # 打印主线程开始信息
time.sleep(1) # 主线程休眠1秒
print("Main thread finished") # 打印主线程结束信息
t1.join() # 等待线程1结束
t2.join() # 等待线程2结束
1. 代码讲解
在这段代码中,我们首先导入了threading和time模块。然后定义了一个名为worker的函数,这个函数接受两个参数:name、delay。name参数表示线程的名称,delay参数表示线程要执行的延迟时间。
接下来,在主程序中,我们创建了两个线程对象t1和t2,分别使用threading.Thread()函数来创建。通过指定target参数为worker函数,args参数为函数的参数,可以将worker函数绑定到线程对象上。这样,每个线程对象都将在不同的线程中执行worker函数。
然后,我们通过调用start()方法来启动线程。同时运行两个线程,它们将独立地执行worker函数。
接下来,我们打印出"Main thread started",然后调用time.sleep(1)来暂停主线程1秒。这样可以让其他线程有足够的时间来执行。
最后,我们打印出"Main thread finished",并且调用join()方法来等待t1和t2线程的结束。这样,主线程将等待所有的子线程完成后才会结束。
2. 代码运行
通过运行这段代码,我们可以看到输出的结果。可以观察到"Worker {name} started"和"Worker {name} finished"两行分别来自不同的线程。这就证明了多线程的并发执行。
二、threading的事件处理event
threading也有用于事件传递的函数event
1. 修改上面的例子
我们给 worker添加一个event参数,判断event没有被set的时候,就sleep 1秒,然后打印当前时间。
当执行t1_event.set(),对应子线程的事件已经被set了,就退出循环,打印finished提示
import threading
import time
# 定义工作函数,模拟线程工作
def worker(name, w_event):
print(f"Worker {name} started") # 打印工作开始信息
while not w_event.is_set(): # 当事件未设置时,执行工作循环
time.sleep(1) # 休眠1秒,模拟工作
# 打印当前时分秒
print(name + ' running ' + time.strftime('%H:%M:%S', time.localtime()))
print(f"Worker {name} finished") # 打印工作结束信息
if __name__ == '__main__':
t1_event = threading.Event() # 创建线程1的事件对象
t1 = threading.Thread(target=worker, args=("Thread 1", t1_event), daemon=True) # 创建线程1,目标为worker函数,参数为("Thread 1", t1_event),并设置为守护线程
t1.start() # 启动线程1
t2_event = threading.Event() # 创建线程2的事件对象
t2 = threading.Thread(target=worker, args=("Thread 2", t2_event), daemon=True) # 创建线程2,目标为worker函数,参数为("Thread 2", t2_event),并设置为守护线程
t2.start() # 启动线程2
print("Main thread started") # 打印主线程开始信息
time.sleep(5) # 主线程休眠5秒
t1_event.set() # 设置线程1事件,通知线程1结束
t2_event.set() # 设置线程2事件,通知线程2结束
print("Main thread finished") # 打印主线程结束信息
t1.join() # 等待线程1结束
t2.join() # 等待线程2结束
2. 看结果
总结
Python的多线程功能使得我们能够同时执行多个任务,从而提高程序的效率和响应性。使用threading模块可以方便地创建和管理线程,使得编写多线程程序变得简单。无论是在处理大量计算或者进行IO操作时,多线程都可以帮助我们更有效地利用计算机的资源。使用多线程时需要注意线程之间的同步和资源管理,避免出现竞争条件和死锁等问题。