Python线程池thread pool创建使用及实例代码分享

Python线程池thread pool创建使用及实例代码分享

Python线程池(thread pool)是一种提供线程复用的机制,通过线程池的管理,可以减少线程创建与销毁的代价,并提升异步并发执行的性能,同时避免资源的浪费,使用起来也相对方便和稳定。本篇攻略将详细介绍如何在Python中使用线程池,通过实例代码的分享帮助读者更好的掌握线程池的使用和工作原理。

创建线程池

Python内置了线程池的支持,使用concurrent.futures模块中的ThreadPoolExecutor类可以方便地创建线程池。

首先,需要导入concurrent.futures模块,以及time模块用于辅助时间计算。

import concurrent.futures
import time

然后,可以通过如下方式创建一个具有4个线程的线程池。

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    # TODO: 任务列表

可以看到,在创建线程池时,可以通过max_workers参数指定线程池中线程的数量,具体数量应该根据具体的场景来确定。同时,在使用完线程池后,需要使用with语句来自动管理线程池的资源。

提交任务

线程池中的工作线程需要执行的任务通过提交操作放入线程池中,线程池会自动选择适当的线程来执行任务。一般情况下,任务都是使用函数的形式传递给线程池。

举个例子,假设有一个需要执行的计算任务,可以通过如下方式定义计算函数。

def compute(num):
    result = num * num
    time.sleep(1)  # 模拟耗时操作
    return result

该函数接收一个参数num,返回num的平方,并使用time.sleep函数模拟耗时操作。

接下来,可以通过使用submit方法将任务提交到线程池中。

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    future_list = []
    for i in range(10):
        future = executor.submit(compute, i)
        future_list.append(future)

可以看到,在遍历任务列表时,可以使用submit方法将任务提交到线程池中,并使用future_list保存任务的结果。submit方法的第一个参数是需要执行的函数,后续的参数是函数的输入参数。

获取结果

线程池中的任务是异步执行的,因此主线程需要使用future对象来获取线程执行的结果。future对象对应一个线程任务,其中包含了线程执行结果和执行状态等参数。

可以使用done方法判断任务是否已经完成,使用result方法获取任务的返回值,如下所示。

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    future_list = []
    for i in range(10):
        future = executor.submit(compute, i)
        future_list.append(future)

    for future in concurrent.futures.as_completed(future_list):
        if future.done():
            print("result: {}".format(future.result()))

可以看到,在使用as_completed方法迭代线程任务时,可以使用future.done()方法判断线程是否执行完,使用future.result()方法获取线程执行结果。

示例说明1:异步下载图片

假设要异步下载多张图片并保存到本地,可以通过使用线程池实现,具体步骤如下。

首先,需要导入requests模块和os模块,后者用于保存图片。

import requests
import os

然后,可以定义下载函数,将图片和本地文件名作为输入参数。

def download_img(url, filename):
    response = requests.get(url, stream=True)
    with open(filename, 'wb') as f:
        for chunk in response.iter_content(1024):
            f.write(chunk)

注意,download_img函数将使用requests.get方法下载图片内容,并使用stream=True参数设置为分块读取,以便在下载大文件时不会占用太多内存。下载完成后,将图片内容保存到指定的文件中。

接下来,可以通过使用线程池,并构造许多下载任务来完成异步下载图片的工作。

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    urls = ["https://picsum.photos/200/300?random={}".format(i) for i in range(10)]
    filenames = [os.path.join(os.getcwd(), "img{}.jpg".format(i)) for i in range(10)]

    future_list = []
    for i in range(10):
        future = executor.submit(download_img, urls[i], filenames[i])
        future_list.append(future)

    for future in concurrent.futures.as_completed(future_list):
        if future.done():
            print("download {} complete".format(future.args[1]))

在上面的代码中,首先构造了10个图片的URL和下对应的文件名,并使用线程池构造了10个下载任务,并将任务的future对象保存在列表中。随后,可以使用as_completed方法依次判断并输出每个任务的状态。

示例说明2:并发执行多个命令

假设要在本地同时执行多个操作系统命令,并等待所有命令执行完成后再输出相应结果,可以通过使用线程池实现。

首先,需要将命令列表构造出来。

commands = ['echo Hello', 'echo World', 'ls -l']

然后,定义命令执行函数。

def run_command(command):
    print("Running command: {}".format(command))
    result = os.popen(command).read()
    time.sleep(1)  # 模拟耗时操作
    return result

在该函数中,首先输出将要执行的命令,然后使用os.popen执行相应命令,并将执行结果保存到返回值中。

然后,可以通过使用线程池,并构造许多命令执行任务来完成异步执行命令的工作。

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    future_list = []
    for command in commands:
        future = executor.submit(run_command, command)
        future_list.append(future)

    for future in concurrent.futures.as_completed(future_list):
        if future.done():
            print("result: {}".format(future.result()))

在上述代码中,首先构造了命令列表,并使用线程池构造了多个命令任务,并将任务的future对象保存在列表中。随后,可以使用as_completed方法依次判断并输出每个任务的执行结果。

总结

Python线程池提供了高效的管理方式和执行异步任务的能力,同时使用也非常简单明了,可以极大提升代码的执行效率和并行性。通过上述示例,相信读者已经对Python线程池有了一定的了解,可以在实际项目中灵活应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python线程池thread pool创建使用及实例代码分享 - Python技术站

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

相关文章

  • python遍历文件夹下所有excel文件

    接下来我给出详细的Python遍历文件夹下所有Excel文件的实例教程。 步骤1:引入相关库 首先,我们需要引入os和pandas库。 import os import pandas as pd 步骤2:定义遍历文件夹函数 我们需要定义一个函数,用于遍历指定目录下所有的Excel文件,并将其读入DataFrame中。 def get_all_excel_fi…

    python 2023年5月13日
    00
  • Python小白必备的8个最常用的内置函数(推荐)

    Python小白必备的8个最常用的内置函数(推荐) Python作为当前最为火热的编程语言之一,有着庞大且强大的函数库,其中内置函数就是最常用的一种。本文将介绍Python小白必须掌握的8个最常用的内置函数。 1. print() print() 是Python中最基本的输出函数,可以将任何类型的数据输出到控制台。 示例代码: print("Hel…

    python 2023年5月20日
    00
  • Python 生成一个从0到n个数字的列表4种方法小结

    以下是“Python生成一个从0到n个数字的列表4种方法小结”的完整攻略。 1. 生成从0到n的数字列表 在Python中,我们可以使用多种方法生成从0到n的数字列表。下面介绍4种常用的方法。 方法1:使用range()函数 range()函数可以生成一个从0到n-1的数字序列,我们可以将其转换为列表表示,例如: n = 5 my_list = list(r…

    python 2023年5月13日
    00
  • python2.7+selenium2实现淘宝滑块自动认证功能

    下面是关于“Python2.7+Selenium2实现淘宝滑块自动认证功能”的完整攻略,包括环境搭建、安装Selenium、代码示例等步骤。 环境搭建 首先,需要安装Python 2.7版本以及pip包管理工具。之后,通过pip安装相关依赖包,包括selenium、pillow和numpy等。这些包的安装可以通过以下命令来完成: pip install se…

    python 2023年5月18日
    00
  • win10从零安装配置pytorch全过程图文详解

    win10从零安装配置pytorch全过程图文详解 如果你是一名Python程序员,想要在Windows 10系统下使用PyTorch来进行深度学习,那么你需要进行一些安装和配置。本攻略将带领你完整的了解在Windows 10系统下从零开始安装并配置PyTorch的全过程。 步骤一:安装Python和pip PyTorch需要Python环境的支持。因此,首…

    python 2023年5月13日
    00
  • 如何编写第一个Python程序?

    下面是编写第一个Python程序的完整攻略: 步骤一:安装Python解释器 在开始编写Python程序之前,我们需要先安装Python解释器。Python官网(https://www.python.org/downloads/)提供了适用于不同操作系统的Python解释器安装包,我们可以根据自己的操作系统下载并安装。 步骤二:编写程序 安装完Python解…

    python 2023年4月19日
    00
  • Python词频统计的两种方法详解

    Python词频统计的两种方法详解 在Python中,统计文本中每个词汇出现的次数是一个常见的需求。本文将介绍两种常见的实现方法。 方法一:使用Counter模块 使用Counter模块是Python中简单、快速的统计词频的方法。可以接受任何可迭代的对象作为输入,包括字符串、列表、元组、字典等。 下面是一个例子,展示如何统计字符串中每个单词出现的次数: fr…

    python 2023年6月3日
    00
  • 基于python log取对数详解

    基于Python log取对数详解攻略 前言 在计算机、数学、自然科学等领域,我们经常需要对数据进行区间缩放或平滑处理,常用的方法就是对数据取对数。Python作为一种通用的编程语言,在这方面也提供了图形化界面。本文将介绍Python log取对数的基本方法,并提供两条示例来说明,希望能对广大Python爱好者有所启发。 基本方法 在Python中,可以使用…

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