python基础——池

池的介绍:

提前创建进程池,防止创建的进程数量过多导致系统性能受到影响,在系统执行任务时,系统会使用池中已经创建进程/线程,从而防止资源的浪费,创建的进程/线程可以让多个进程使用,从而降低了操作系统的负担,加快了系统执行的效率;

若果不创建进程池,可能会导致任务建立的进程数量过多,影响系统,并且在执行不同任务时,还会重新进行进程的创建,导致资源的浪费

 池的使用:

进程池:

ProcessPoolExecutor

进程池的使用:
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def func(i):print("进程号:{}\n".format(current_thread().ident))print("进程{}\n".format(i))tp = ThreadPoolExecutor(4)
ts = ProcessPoolExecutor(10)
if __name__ == '__main__':for i in range(100):tp.submit(func,i)

运行结果:

由于此时池中创建了四个进程,因此函数func()在执行多次的过程中会循环的使用四个已经创建的进程(如上图)

不使用进程池:
from threading import current_thread
from multiprocessing import Processdef func(i):print("进程号:{}".format(current_thread().ident))print("进程{}".format(i))if __name__ == '__main__':for i in range(10):t = Process(target=func,args=(i,)).start()

运行结果:

两者对比可以看到,由于后者未使用进程池,因此,在func()函数执行了10次时,系统创建了十个进程,而前者使用了建立了四个进程的进程池,因此,即使func()函数执行了100次,系统也只创建了4个进程

线程池:

不使用线程池:

from threading import current_thread
from threading import Threaddef func(i):print("线程号:{}".format(current_thread().ident))
if __name__ == '__main__':for i in range(10):t = Thread(target=func,args=(i,)).start()

运行结果:

有结果可以看到:使用线程运行了十次func()函数,系统创建了十个进程用来执行此任务

使用线程池:

from threading import current_thread
from concurrent.futures import ThreadPoolExecutordef func(i):print("线程号:{}".format(current_thread().ident))
if __name__ == '__main__':tp = ThreadPoolExecutor(20)for i in range(100):tp.submit(func,i)

运行结果:

执行100次,但是被使用的线程仅有创建的20个,节省了系统的资源

使用map()方法进行函数的传递

from threading import current_thread
from concurrent.futures import ThreadPoolExecutordef func(i):print("线程号:{}".format(current_thread().ident))print(i)
if __name__ == '__main__':tp = ThreadPoolExecutor(4)ret = tp.map(func,(i for i in range(10)))print(ret)

 回调函数:

from threading import current_thread
from concurrent.futures import ThreadPoolExecutordef func(i):print("线程号:{}".format(current_thread().ident))print(i)return  i**2
def print_func(ret,i):print("我是print_func()函数")print(ret.result())if __name__ == '__main__':tp = ThreadPoolExecutor(4)for i in range(20):ret = tp.submit(func,i)ret.add_done_callback(print_func)

运行结果:

使用回调函数可以保证ret对象在执行完毕之后立即执行回调函数的参数对象

进程创建数量的建议:

进程数量:建议进程数量为cpu数量的一倍 到cpu数量的二倍之间

线程数量:建议线程数量为cpu数量的五倍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript Array(九) 数组

1.TypeScript Array 数组 1.1. 描述 数组对象是使用单独的变量名来存储一系列的值。  &emsp比如,你现在有一组数据,存单独变量如下: var data1"Android"; var data2"Java"; var data3"Harmony";那如果有…

南昌市青山湖、滕王阁、洛阳路隧道FM调频广播集群通信调度系统应用案例

一、用户需求 青山湖隧道,是南昌市一条东西走向的城市主干道,隧道为双向6车道,长1070米,其中湖底暗埋段为550米,净高5.45米,两孔每孔净宽12.4米。 滕王阁隧道是南昌市沿江北大道与沿江中大道连通工程&#…

计算机网络实验二

目录 实验二 交换机的基本配置 1、实验目的 2、实验设备 (1)实验内容: (2)练习: 1.实验内容一:(交换机的配置方式) 2.实验内容二:(交换机…

云打印怎么收费?云打印需要付费吗?

随着云打印概念的火热发展,很多有打印需求的App或者个人用户都想使用易绘创云打印服务。那么易绘创云打印怎么收费?云打印需要付费吗?今天就带大家来了解一下。 云打印怎么收费?云打印需要付费吗? 很多有打印需求的小…

go 问题记录(日志丢失)

问题描述: 在go程序中,通过执行一个命令启动一个子命令,并通过pipe读取子程序的标准输入和输出,通过scanner默认按行读取,此时如果子程序输出时没有携带’\n’,scanner就不会打印输出,而是会累…

正则表达式 与文本三剑客(sed grep awk)

一,正则表达式 (一)正则表达式相关定义 1,正则表达式含义 REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意…

EMQX 性能调优:TCP SYN 队列与 Accept 队列

在上一篇博客(EMQX 性能调优:最大连接与文件描述符),我们深入研究了 MQTT 连接与文件描述符之间的关系,介绍了如何修改文件描述符相关的内核参数来突破默认的最大连接数量限制。 但你可能会发现,在某些情况…

Java 面向对象进阶 03 static 注意事项、重新认识main方法(黑马)

案例代码如下: 非静态的方法虚拟机会自带一个关键字,如下: 但是不能手动出来,它的类型就是当前类; 通过输出this,得到当前s1,s2 的地址; 所以在输出时会有隐藏的this,所以this所指向…

Vue3+Echarts实现实时曲线及开始与暂停功能

最近做电力项目中,遇到这样一个需求: 用户选择设备的属性后(多选情况,可以选择不同设备的属性),然后请求各自的数据,使用折线图的形式实现趋势展示,同时要支持暂停和开始功能&#x…

Redis -- 单线程模型

失败是成功之母 ——法国作家巴尔扎克 目录 单线程模型 Redis为什么这么快 单线程模型 redis只使用一个线程,处理所有的命令请求,不是说redis服务器进场内部真的就只有一个线程,其实也有多个线程,那就是处理网络和io的线程。 R…

MBR分区转换为GPT分区

这里有一个ecs-test用于测试MBR转换为GPT 新增一块数据盘 将数据盘以MBR分区格式分区 将整块磁盘以mbr形式分区 格式化,挂载等 上传文件,方便测试(以便后续转换格式类型,防止文件丢失) 取消挂载 将MBR转换为GPT 需先下载gdisk yum instal…

联盟营销最有效的方法是什么?

联盟营销就是“Affiliate marketing,是一种有效的市场推广策略,通过与其他相关企业或个人建立合作关系,共同推广产品或服务。每带来一次有效交易(如用户购买、注册等),推广者就能获得佣金,将流量…

前端常见的栈溢出报错

什么是栈溢出? 在前端开发中,栈溢出是指JavaScript引擎执行代码时,调用栈(call stack)变得太大,超过了浏览器或JavaScript引擎所分配的栈空间,从而导致栈溢出错误。调用栈是一种数据结构&#x…

element plus dialog滚动条置顶问题

直接上解决方案了 <el-dialog v-model"DialogVisible" :destroy-on-close"true"><el-table :data"" :show-header"false" max-height"350"></el-table> </el-dialog>注意&#xff1a;主要是:destr…

WINHTTP忽略HTTPS证书

文章目录 WINHTTP忽略HTTPS证书WINHTTP使用TLS协议版本 WINHTTP忽略HTTPS证书 发布了Wininet库忽略Https证书文章之后有朋友问我如果使用WINHTTP发起忽略证书的方法, 下列粘出代码可以看到跟Wininet是一样的不在过多赘述&#xff0c;不懂的朋友可以看我发的链接说明。C发起Htt…

Spring-集成Web

一、引子 前面我们在Spring集成Junit中为读者引出了Spring善于集成其它框架的优势&#xff0c;而Spring项目不可能仅限于小范围的某个方法的测试&#xff0c;终究会落脚于Web项目上。于是&#xff0c;我们就从这里正式进入Spring集成Web的话题。由于笔者会从原生的Java Web开发…

@Test Annotation属性- dependsOnMethods属性

目录 语法 如果test1&#xff08;&#xff09;失败了怎么办&#xff1f;test2&#xff08;&#xff09;测试会发生什么&#xff0c;因为它依赖于test1&#xff1f; 如果我们在test1&#xff08;&#xff09;方法上不使用Test注释&#xff0c;但在test 2&#xff08;&#xf…

【产业实践】使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通

使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通 效果图 背景介绍 当谈到目标检测算法时,YOLO(You Only Look Once)系列算法是一个备受关注的领域。YOLO通过将目标检测任务转化为一个回归问题,实现了快速且准确的目标检测。以下是YOLO的基…

每日打卡 力扣2808 使循环数组所有元素相等的最少秒数

2808. 使循环数组所有元素相等的最少秒数 题目描述&#xff1a; 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每一个下标 i &#xff0c;将 nums[i] 替换成 nums[i] &#xff0c;num…

【centos系统ddos攻击】

centos系统ddos攻击&#xff0c;使用hping3和ab测试攻击模拟攻击 hping3工具 hping3 是一个命令行下使用的 TCP/IP 数据包组装/分析工具&#xff0c;通常 web 服务会用来做压力测试使 用&#xff0c;也可以进行 DOS 攻击的实验。同样 hping3 每次只能扫描一个目标。 安装hpin…