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.hqwc.cn/news/443174.html

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

相关文章

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(一)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现,还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

Unity触发检测Trigger踩坑合集

正常状态 绿色方块:刚体碰撞盒检测触发碰撞脚本 蓝色方块:碰撞盒 检测脚本: 正常进出: 踩坑1 绿色方块:刚体碰撞盒检测触发碰撞脚本 蓝色方块:碰撞盒 保持绿色和蓝色方块的接触 对蓝色方块&#xff1a…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件,其主要有三部分组成:行星服务器Planet、月亮服务器Moon、客户端节点Leaf,行星服务器是ZeroTier的根节点,可以采用ZeroTier官方的服务器,也可以使用开源代码自行搭建。 …

12.Golang中类的表示与封装

目录 概述类的表示代码结果 类的封装代码结果 结束 概述 Golang中类的表示与封装 类的表示 代码 注释掉的代码,并不能拿来当赋值或获取值来使用。 package mainimport "fmt"// 类大写则代表,可以被其它包使用 type Hero struct {// 属性方法大…

【pdf密码】怎么打印加密的PDF文件?

PDF文件是可以打开查看的,但是现在不能编辑、不能打印,功能栏中的功能都是灰色的,这种设置了加密的PDF文件该如何加密? 如果PDF中的大多数功能按钮以及打印按钮都是灰色的状态,那就证明是文件的问题导致不能打印的。 …

FSM有限状态机理解和实现,附上源代码

1、前言 之前在unity中看到动画状态机的转换,可以看到下图,在开发中还是很方便。 2、状态机是啥 状态机(state machine)是一种计算模型,用于描述系统或程序在不同状态之间转换的行为。 一般我们定义的状态都是有限的。所以所以FSM被称为有限状态机。 状态机有 3 个组成…

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式? 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利…

Mysql聚合函数

聚合函数又称分组函数 多行(一组)数据 返回一个结果 数据表 链接:https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码:b0rp --来自百度网盘超级会员V5的分享 聚合函数会自动排除掉null字段 AVG SUM 适用于数值类型 MIN MAX 适用于数值…

Python中类的相关术语(附带案例)

目录 1、面向对象 2、类 3、实例 4、初始化方法 5、魔法方法 6、字符串方法 7、self 8、数据、属性、操作、行为 9、父类、基类、超类 or 子类、派生类 10、多态 11、重载多态 and 重写多态 12、名称解释 1、面向对象 在Python中,面向对象编程&…

实现单点登录

指再多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。 相比于单系统登录,sso需要一个独立的认证中心,只有认证红心能接受用户的用户名密码等安全信息,其他系统…

nodejs详细介绍2以及vue脚手架

前言 首先给宝子们说声抱歉,因为自己在使用vscode执行vue脚手架的时候出现了很多问题,在经过解决之后还是有一个对应的我弄了一天没弄好,就是“vscode的终端将被任务重用,按任意键关闭”然后导致的是自己没心情学习一点&#xff…

人工视觉仍然需要图像采集卡

最初,图像采集卡被用作模拟视频数字转换器和图像缓冲器,但如今它们能够执行复杂的任务,例如图像处理。图像采集卡的设计不断发展,旨在提高系统性能并减少计算机处理需求。 除了图像采集之外,图像采集卡还执行机器视觉…