Python线程编程之Thread详解

  • Post category:Python

Python线程编程之Thread详解

在 Python 中,我们可以使用 Thread 类创建和管理线程,下面就来详细讲解一下 Thread 类用法。

什么是线程?

线程是指程序执行流的最小单位,它是进程中的一个实体。线程是轻量级的,一个进程可以创建多个线程,多个线程可以同时执行。线程的创建和销毁比进程要快,线程间的切换和调度也比进程更快。线程共享进程的内存空间,所以共享数据比进程更加方便快捷。

创建线程

创建线程有两种方式,一种是继承 Thread 类,另一种是实例化 Thread 类。这里以实例化 Thread 类为例进行说明。代码如下:

import threading

class MyThread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name

    def run(self):
        print("Thread ", self.name, " is running")

if __name__ == '__main__':
    t1 = MyThread("t1")
    t2 = MyThread("t2")

    t1.start()
    t2.start()

这个例子中,我们创建了一个 MyThread 类,继承自 Thread 类。通过重写 run 方法,实现了线程真正要执行的代码逻辑。我们创建了两个线程 t1 和 t2,分别运行 MyThread 类的实例,并调用了 start 方法,启动了线程。程序运行结果如下:

Thread t1 is running
Thread t2 is running

线程的生命周期

线程的生命周期包括:新建状态、就绪状态、运行状态、阻塞状态、死亡状态。

新建状态是指线程对象已经创建,但是还没有调用 start 方法启动线程,此时线程处于新建状态。

就绪状态是指线程调用 start 方法后,等待系统分配资源,准备进入运行状态,此时线程处于就绪状态。

运行状态是指被操作系统调度后正在运行,此时线程处于运行状态。

阻塞状态是指线程等待 I/O、加锁等操作后进入阻塞状态,此时线程处于阻塞状态。

死亡状态是指线程执行完所有代码后结束,此时线程处于死亡状态。

线程的同步

有时我们需要线程之间同步执行,避免资源抢占,这时候可以使用 threading 模块提供的锁来实现。代码如下:

import threading

count = 0

lock = threading.Lock()

def add():
    global count
    lock.acquire()
    count += 1
    lock.release()

if __name__ == '__main__':
    threads = []
    for i in range(100):
        t = threading.Thread(target=add)
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

    print("count = ", count)

在这个例子中,我们创建了一个全局变量 count,100 个线程同时对其进行加 1 操作。为了防止资源抢占,我们使用了锁。各个线程依次获取锁,完成自己的操作之后释放锁,其他线程才可以继续获取锁,避免了多个线程同时操作同一个资源引起的错误。程序运行结果如下:

count =  100

线程的并发

Python 中的 GIL(全局解释器锁)限制了 Python 线程的并发度,因为某一时刻只有一个 Python 线程可以执行 Python 解释器的指令。但是,多个 Python 线程可以同时调用其他的 C/C++ 扩展模块或操作系统接口,实现了一定程度的并发。

总结

本文主要介绍了 Python 中 Thread 类的使用方法,代码实现了线程的创建、生命周期、同步、并发等功能。Python 的线程编程需要注意 GIL 的限制和资源同步问题,有时候可以使用多进程来代替线程完成某些任务。