Python 多线程

简介

本文将深入探讨Python中的多线程编程,重点关注于Python 3版本。我们将使用markdown格式来展示内容,所有代码和解释都是中文的。

Python中的线程

在开始之前,让我们先了解一下什么是线程。简而言之,线程是一个执行流,可以同时进行多个任务的子任务。在Python中,threading模块提供了对线程的支持。

Python的GIL(全局解释器锁)

在深入讨论多线程之前,我们必须要了解Python的GIL。由于Python的内存管理不是线程安全的,一个线程对内存进行写操作时,其他线程将被阻塞,以防止数据混乱。这就是GIL所起到的作用。

创建线程

在Python中,我们可以使用threading.Thread类来创建一个新的线程。下面是一个简单的例子:

import threading

def print_cube(num):
    """
    定义一个打印数字立方的函数
    """
    print("Cube: {}".format(num * num * num))

def print_square(num):
    """
    定义一个打印数字平方的函数
    """
    print("Square: {}".format(num * num))

if __name__ == "__main__":
    # 创建新线程
    thread1 = threading.Thread(target=print_square, args=(10, ))
    thread2 = threading.Thread(target=print_cube, args=(10, ))

    # 开启新线程
    thread1.start()
    thread2.start()

    # 等待至线程中止
    thread1.join()
    thread2.join()

    print("Done!")

在上面的代码中,我们创建了两个函数:print_squareprint_cube。然后,我们使用这些函数作为目标来创建两个新线程。最后,我们调用.start()方法启动新线程,并使用.join()方法等待它们完成执行。

同步线程

在多线程编程中,同步是一个重要的概念。如果多个线程访问共享资源,则可能会发生数据不一致或竞态条件。Python提供了threading.Lock对象来处理这种情况:

import threading

# 创建锁
lock = threading.Lock()

def add_numbers(num):
    """
    一个修改全局变量的函数
    """
    global total
    lock.acquire()
    try:
        total += num
    finally:
        lock.release()

total = 0
threads = []
for i in range(100):
    t = threading.Thread(target=add_numbers, args=(i,))
    threads.append(t)
    t.start()

# 等待所有线程完成
for t in threads:
    t.join()

print("Total: {}".format(total))

在这个例子中,我们创建了一个锁对象,并在修改共享资源之前获取它。如果另一个线程已经持有该锁,则当前线程将被阻塞,直到锁被释放。

结论

本文提供了Python多线程编程的基础知识,包括GIL、创建线程和同步线程。希望这篇教程能够帮助你更好地理解和使用Python中的多线程。