看langchain代码之前必备知识之 - Python 多线程: threading


前言

在之前的文章中,我们分别学习了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操作时,多线程都可以帮助我们更有效地利用计算机的资源。使用多线程时需要注意线程之间的同步和资源管理,避免出现竞争条件和死锁等问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值