Python线程的两种编程方式

2023-12-16Python编程
7

Python支持两种线程编程方式:使用threading模块和使用concurrent.futures模块。下面分别对这两种方式进行详细讲解:

使用threading模块

1. 创建线程

要创建线程,需要导入threading模块,并且创建Thread对象。下面是一个简单的示例,演示如何创建一个线程:

import threading

def worker():
    """线程执行的任务"""
    print("Thread started.")
    print("Thread finished.")

t = threading.Thread(target=worker)
t.start()

在这个示例中,我们通过定义worker函数来定义线程需要执行的任务。然后,创建Thread对象,把worker函数传递给target参数,最后调用start方法启动线程。

2. 线程同步

在多线程编程中,线程可能会在没有同步的情况下同时访问共享资源,因此需要进行线程同步。Python提供了多种同步机制,例如锁、信号量等。

下面是一个示例,演示如何使用锁进行线程同步:

import threading

x = 0
lock = threading.Lock()   # 创建锁对象

def worker():
    global x
    for i in range(100000):
        lock.acquire()   # 获取锁
        x += 1
        lock.release()   # 释放锁
    print("Thread finished.")

t1 = threading.Thread(target=worker)
t2 = threading.Thread(target=worker)
t1.start()
t2.start()
t1.join()
t2.join()
print(x)

在这个示例中,我们定义了一个共享资源x,并且创建了一个锁对象。在worker函数中,使用锁进行同步,保证x的操作是原子的。最后我们启动两个线程,让它们同时访问共享资源x,并用join方法等待所有线程结束后再输出x。

使用concurrent.futures模块

concurrent.futures模块是Python3中新增的模块,它提供了更高级的线程池接口,更方便地实现并发执行任务。

1. 创建线程池

要使用concurrent.futures模块,首先需要导入ThreadPoolExecutor类。然后,创建ThreadPoolExecutor对象,指定线程池的大小。下面是一个示例,演示如何创建线程池:

from concurrent.futures import ThreadPoolExecutor

def worker():
    """线程执行的任务"""
    print("Task finished.")

with ThreadPoolExecutor(max_workers=2) as executor:
    future1 = executor.submit(worker)
    future2 = executor.submit(worker)

在这个示例中,我们创建了一个大小为2的线程池,然后通过submit方法提交两个任务。submit方法会返回Future对象,我们可以通过Future对象获取任务的执行结果。

2. 处理任务的返回值

在concurrent.futures模块中,每个任务的执行结果都是通过Future对象获取的。Future对象表示一个异步操作的未来结果,它可以用来查询操作的状态、取消操作等。

下面是一个示例,演示如何处理任务的返回值:

from concurrent.futures import ThreadPoolExecutor

def worker(n):
    """线程执行的任务"""
    return n * n

with ThreadPoolExecutor(max_workers=2) as executor:
    future1 = executor.submit(worker, 2)
    future2 = executor.submit(worker, 3)
    print(future1.result())   # 输出4
    print(future2.result())   # 输出9

在这个示例中,我们定义了一个worker函数,它会返回传入参数的平方。然后创建了一个大小为2的线程池,并通过submit方法提交两个任务。最后,通过Future对象的result方法获取任务的执行结果,并输出结果。

以上是Python线程的两种编程方式的详细攻略,包括了创建线程、线程同步、处理任务返回值等方面的知识点。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103