Python多线程thread及模块使用实例

yizhihongxing

下面就给您详细讲解“Python多线程thread及模块使用实例”相关知识。

1. Python多线程thread的介绍

Python提供了多线程的支持,它是通过thread模块实现的。由于GIL(全局解释器锁)的问题,Python的多线程无法实现真正的并发,但是在IO密集型的任务中,多线程还是有着很大的优势的。下面我们来看一下Python多线程的一些基本用法。

2. Python多线程thread模块的使用

首先,我们需要导入threading模块。Thread()是threading的一个类,我们可以通过实例化这个类来创建线程。

2.1 创建线程

线程的创建通过调用Thread()类实现,下面是一个简单的例子:

import threading

def print_hello():
    print('Hello World!')

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

在这个例子中,我们定义了一个函数print_hello(),然后创建了一个线程t,并将这个函数作为参数传给它。最后调用了线程的start()方法,线程就开始执行了。

2.2 线程同步

线程同步指的是让线程按照一定的顺序执行,避免出现竞争条件的情况。在Python中,可以使用锁来实现线程同步,这里介绍一下常用的Lock类。

import threading

# 创建一个锁对象
lock = threading.Lock()

# 全局变量
sum = 0

def add(n):
    global sum
    for i in range(n):
        # 获取锁
        lock.acquire()
        sum += 1
        # 释放锁
        lock.release()

# 创建两个线程
t1 = threading.Thread(target=add, args=(100000,))
t2 = threading.Thread(target=add, args=(100000,))

# 启动线程
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()

print(sum)

在这个例子中,我们创建了一个锁lock,然后定义了一个函数add(n),该函数会让全局变量sum加上n次。在每一次加操作之前,我们都先获取锁,然后执行加操作,在结束后释放锁。接下来,我们创建了两个线程,让它们执行这个函数,最后得到的结果是200000

2.3 线程间通信

线程间通信指的是线程之间的数据传递或传递消息。在Python中,我们可以使用Queue类来实现线程间通信。下面是一个简单的例子:

import threading
import queue

# 创建一个空的队列
q = queue.Queue()

# 生产者函数
def producer():
    for i in range(10):
        # 向队列中添加元素
        q.put(i)
        print('produce:', i)

# 消费者函数
def consumer():
    while True:
        # 从队列中获取元素,如果队列为空,则阻塞等待
        item = q.get()
        if item is None:
            break
        print('consume:', item)
        # 告诉队列这个元素已经处理完毕
        q.task_done()

# 创建生产者和消费者线程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)

# 启动生产者和消费者线程
t1.start()
t2.start()

# 等待生产者线程结束
t1.join()

# 阻塞并等待队列中所有元素都被处理完毕
q.join()

# 给消费者线程发送一个结束信号
q.put(None)

# 等待消费者线程结束
t2.join()

在这个例子中,我们创建了一个队列q,然后定义了一个生产者函数producer()和一个消费者函数consumer()。生产者函数会向队列中添加元素,消费者函数会从队列中获取元素并进行处理。

接下来我们创建了生产者和消费者两个线程,并启动它们。生产者线程完成任务后退出,消费者线程会阻塞等待从队列中获取元素,直到生产者线程发送一个结束信号。

3. Python线程池介绍

Python线程池使用ThreadPoolExecutor类来实现。线程池可以让我们不需要每次创建新线程来执行任务,而是预先创建一定数量的线程。任务提交后就会立即执行,当线程池中的线程都处于忙碌状态时,新的任务会被暂时存储在队列中,等待线程的空闲。

3.1 创建线程池

from concurrent.futures import ThreadPoolExecutor

# 创建一个包含10个线程的线程池
with ThreadPoolExecutor(max_workers=10) as executor:
    # 提交任务给线程池处理
    executor.submit(my_func, *args)

在这个例子中,我们使用了Python的上下文管理器(With语句)来自动地管理线程池的创建和销毁。创建线程池的代码只需要一行。使用线程池时,我们只需要不断地向线程池提交需要处理的任务即可。

3.2 示例说明:使用Python线程池下载多个图片

import os
import urllib.request
from concurrent.futures import ThreadPoolExecutor

# 图片url
url_list = ['http://www.gstatic.com/webp/gallery/1.jpg', 'http://www.gstatic.com/webp/gallery/2.jpg', 'http://www.gstatic.com/webp/gallery/3.jpg', 'http://www.gstatic.com/webp/gallery/4.jpg', 'http://www.gstatic.com/webp/gallery/5.jpg']

def download_file(url):
    # 获取文件名
    filename = os.path.basename(url)
    # 下载图片
    urllib.request.urlretrieve(url, filename)
    print('下载图片成功:', url)

# 创建包含3个线程的线程池
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交任务给线程池下载图片
    for url in url_list:
        executor.submit(download_file, url)

在这个例子中,我们定义了一个下载文件的函数download_file(),该函数会把图片下载到本地。接下来我们把五张图片的url放在一个列表中,然后通过线程池对每一个url进行下载。我们创建了一个包含3个线程的线程池,线程池会自动地为每一个任务分配一个线程,当所有任务都完成后,线程池会自动停止。

4. 总结

Python的多线程thread模块和线程池ThreadPoolExecutor类是非常实用的工具,在处理一些需要IO操作的任务时可以大大提高程序运行的效率。但是由于GIL的存在,Python的多线程无法实现真正的并发,所以在处理计算密集型的任务时,不如使用多进程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程thread及模块使用实例 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 如何在Python中实现加权均方误差

    在Python中实现加权均方误差,可以按照以下步骤进行: 导入需要的库 首先,我们需要导入numpy库。因为加权均方误差的计算需要用到numpy的一些函数。 import numpy as np 编写加权均方误差计算函数 接下来,我们可以定义一个名为weighted_mse的函数,用于计算加权均方误差。函数参数包括: y_true:真实值,类型为一维nump…

    python-answer 2023年3月25日
    00
  • python函数修饰符@的使用方法解析

    在Python中,可以使用函数修饰符@来装饰函数,以实现一些特定的功能。以下是@的使用方法解析: 基本用法 @的基本用法是将一个函数修饰为另一个函数。以下是一个简单的示例: def my_decorator(func): def wrapper(): print("Before function is called.") func() p…

    python 2023年5月14日
    00
  • Python 推导式、生成器与切片问题解决思路

    Python 推导式、生成器与切片是Python编程中非常常用的语法和技巧。以下是针对这些问题的完整攻略: Python 推导式 Python 推导式是一种快速生成数据结构的方法,包括列表推导式、字典推导式和集合推导式。它们的格式都比较类似,主要由两个部分组成:表达式和迭代器。其中,表达式是将迭代器中的元素进行操作的计算式子,而迭代器可以是列表、字典、集合等…

    python 2023年6月3日
    00
  • python3中rsa加密算法详情

    下面就来详细讲解 Python3 中 RSA 加密算法的完整攻略。 什么是 RSA 加密算法? RSA 是一种非对称加密算法,即加密与解密使用的是不同的密钥。 RSA 加密算法的原理是:使用两个大素数 p 和 q 计算出 N = p * q,然后选取两个数 e 和 d,使得 e * d ≡ 1 (mod (p-1) * (q-1)),e 称为公钥,d 称为私…

    python 2023年5月20日
    00
  • Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

    Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答 简介 本篇教程主要介绍了如何使用Python中的PyAudio库实现录音功能,并结合自然语言处理技术,构建一个自动化交互系统。该系统可以接收语音输入,并通过语音合成技术输出结果,实现语音问答的功能。 安装PyAudio 首先需要安装PyAudio库,可以通过以下方式进行安装: pip …

    python 2023年5月19日
    00
  • Python中requests做接口测试的方法

    那我先给你简述一下Python中使用requests进行接口测试的步骤: 导入requests模块 发送HTTP请求(GET、POST等) 获取HTTP响应 解析响应结果 断言检查结果是否符合预期 下面我来给你详细讲解Python中使用requests进行接口测试的方法,并附上两个实例说明。 第一条示例: 我们以测试百度搜索接口为例: 导入requests模…

    python 2023年5月13日
    00
  • python 实现目录复制的三种小结

    Python 实现目录复制的三种小结 在 Python 中,实现目录复制有很多种方法,本文将介绍三种常用的方法。 方法一:使用 shutil 模块 最简单的方法就是使用 Python 自带的 shutil 模块进行目录复制。这个模块提供了很多实用的函数,其中包括 copytree() 函数可以用来实现目录复制。 示例1 import shutil # 定义源…

    python 2023年6月3日
    00
  • Python教程之无限迭代器的使用详解

    下面我就详细讲解一下Python教程之无限迭代器的使用详解。 什么是迭代器 在了解无限迭代器之前,我们需要先了解一下什么是迭代器。迭代器是Python中一种用于遍历数据集合的对象,可以用来逐个访问集合中的元素。Python语言内置了很多迭代器对象,比如list、tuple、set、dict等集合对象,都可以使用迭代器进行遍历操作。 对于一个可迭代的对象,比如…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部