首页 > 编程语言 >Python多线程-线程池ThreadPoolExecutor

Python多线程-线程池ThreadPoolExecutor

时间:2024-07-05 16:08:18浏览次数:15  
标签:map Python slp list 线程 import 多线程 ThreadPoolExecutor

1. 线程池

不是线程数量越多,程序的执行效率就越快。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所以有时候开辟过多的线程不但不会提高程序的执行效率,反而会适得其反使程序变慢,得不偿失。

为了防止无尽的线程被初始化,于是线程池就诞生了。当线程池初始化时,会自动创建指定数量的线程,有任务到达时直接从线程池中取一个空闲线程来用即可,当任务执行结束时线程不会消亡而是直接进入空闲状态,继续等待下一个任务。而随着任务的增加线程池中的可用线程必将逐渐减少,当减少至零时,任务就需要等待了。这就最大程度的避免了线程的无限创建,当所需要使用的线程不知道有多少时,一般都会使用线程池。

在 python 中使用线程池有两种方式,一种是基于第三方库 threadpool,另一种是基于 python3 新引入的库 concurrent.futures.ThreadPoolExecutor,这里我们介绍一下后一种。

2.submit方法

  • ThreadPoolExecutor

ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())
最常用的是 max_workers 参数,即线程池中的线程数。

  • submit

submit(fn, *args, **kwargs)
其中 fn 为方法名,其后的 *args, **kwargs 为该方法的参数。

  • 示例:
import  threading
from concurrent.futures import ThreadPoolExecutor
import time
import random

# 对两数进行加法,并停留0-60随机秒数
def add(a, b):
    sum = a + b
    slp = random.randint(0,60)
    time.sleep(slp)
    print('{} is running, {} + {} = {} ,thread sleep {} seconds'.format(threading.current_thread().name,a,b,sum,slp))

# 加法的两个因数
list_a = [1, 2, 3, 4, 5, 6 ,7]
list_b = [6, 7, 8, 9, 10 ,11 ,12]
# 使用with上下问管理器,就不用管如何关线程池了
with ThreadPoolExecutor(2) as pool:
    # 将每一个线程都进行提交
    for i in range(len(list_a)):
        pool.submit(add, list_a[i], list_b[i])

运行截图:

 

3.map方法

  • map :

map(func, *iterables, timeout=None, chunksize=1)

func 参数为多线程指向的方法名,*iterables 实际上是该方法的参数,该方法的参数必须是可迭代对象,即元组或列表等,不能单纯的传递 int 或字符串,如果 timeout 设定的时间小于线程执行时间会抛异常 TimeoutError,默认为 None 则不加限制。

使用 map 方法,有两个特点:

无需提前使用submit方法
返回结果的顺序和元素的顺序相同,即使子线程先返回也不会获取结果

  • 示例:
import time
import random
import threading
from concurrent.futures import ThreadPoolExecutor

def add(a, b):
    sum = a + b
    slp = random.randint(0,60)
    time.sleep(slp)
    print('{} is running, {} + {} = {} ,thread sleep {} seconds'.format(threading.current_thread().name,a,b,sum,slp))
    return sum

list_a = [1, 2, 3, 4, 5, 6 ,7]
list_b = [6, 7, 8, 9, 10 ,11 ,12]
with ThreadPoolExecutor(2) as pool:
    # map中list_a与list_b按照下标一一对应
    for result in pool.map(add, list_a, list_b):
        print('result = {}'.format(result))

运行截图:

 

标签:map,Python,slp,list,线程,import,多线程,ThreadPoolExecutor
From: https://www.cnblogs.com/yeyuzhuanjia/p/18286041

相关文章

  • Python的垃圾回收机制
    Python的垃圾回收机制引入计数器为主,标记清除和分代回收为辅1.引入计数器环状双向链表refchain在python程序中创建的任何对象都会放在refchain链表中当python程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到rec......
  • python中logging
    Python的logging模块是一个用于记录应用程序日志消息的标准模块。它非常强大且灵活,允许你记录各种级别的日志消息,并配置输出格式、日志的存储位置以及处理日志的不同方式。以下是logging模块的基本介绍和用法。defcreate_logger(log_file):log_format='%(asctime)s......
  • 为什么现在的AI编程师都是用Python来编程?
    前言: 在当今AI大火的时节,涌入了一大批AI编程师,和AI训练师!显而易见他们都是用的Python语言来编程的。当然AI也给我们的工作带来了很多便利,比如AI绘画,写文章,视频剪辑,脚本创做等等方面现在都可以来用AI来协助我高效完成工作。那么我们来看看现在的AI编程师为什么都用Python语言......
  • python基础汇总(1)
    开始可以借鉴阿里腾讯开发规范——实际中运用会大体相近1、注释#:单行注释‘’‘’‘’或者“”“”“”:多行注释2、标识符合法:ABC、ABC_123、姓名、_123不合法:123、1ABC、if(保留字)、init(预定义标识符)(1)当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使......
  • 《python机器学习从入门到高级》
    《python机器学习从入门到高级》分类算法:引言我们在之前的文章已经介绍了机器学习的一些基础概念,当拿到一个数据之后如何处理、如何评估一个模型、以及如何对模型调参等。接下来,我们正式开始学习如何实现机器学习的一些算法。回归和分类是机器学习的两大最基本的问题,对于......
  • python数据结构(树和二叉树)
    树非线性结构一对多根结点(无前驱)多个叶子结点(无后继)其他数据元素(一个前驱,多个后驱)树与二叉树转换树与二叉树均可用二叉链表作为存储结构,则以二叉链表为媒介可导出树之间的一个对应关系-----即给定一颗树,可以找到唯一一颗二叉树与之对应。把树转化为二叉树步骤一:加线......
  • Box,一个字典操作python库
     Box介绍Box是一个让字典操作变得异常简单与直观,支持通过属性访问字典内容的库。 特点概述属性访问Box允许用户像访问对象属性一样访问字典的值,提升了代码的可读性和易用性。无缝嵌套自动将嵌套的字典转换为Box对象,使得处理复杂字典结构变得轻而易举。灵活性......
  • Python速通(条件语句)
    (牛牛的选择)牛牛在牛客网经过了两次笔试分别获得了Tencent和Alibaba的面试资格,不巧的是这两次面试的时间冲突了。两家公司牛牛都想去,他决定通过笔试的成绩判断去参加哪家公司的面试。现在输入两行浮点数,分别表示牛牛在Tencent和Alibaba的笔试成绩,请比较两个成绩,输出笔试成绩较高的......
  • 小白也能看懂的Python基础教程(9)
    目录Python文件操作1、文件操作概述什么是文件?文件操作包含哪些内容呢?文件操作的作用2、文件的基本操作open()打开函数mode访问模式详解读操作相关方法read()方法:readlines()方法:readline()方法:file读取文件之readfile读取文件之readlines和reanline相对和绝对......
  • 动态线程池的设置实践
    引言目的:提升系统吞吐率和响应性,同时面临线程池参数配置难题。问题:参数配置不合理可能导致服务器负载过高、服务不可用或内存溢出等问题。解决方案:动态线程池,允许实时变更核心参数并监控运行状态。动态线程池定义概念:能够动态变更核心参数,监控并告警线程池状态的线程池。......