(10)进程池

摘要:
进程池不能无限打开,线程也不能无限打开。因此,池的概念诞生了。池中放置了一定数量的进程或线程。进程池importosimportTimefromProcessingimportPool#的设置要打开进程池,池函数deftask(i):print(i)time。sleep(1)if__name__=='__main__':打印(os.cpu_count())#查看cpu数量

进程池不能无限开,线程也是不能无限开

因此就诞生了池的概念

这个池里面放了一定的数量的进程数或者线程数

进程池的设置

import os
import time
from multiprocessing import Pool #开启进程池要倒入Pool函数

def task(i):
print(i)
time.sleep(1)

if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
'''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
p = Pool(5) #实例化5个进程,一次只能执行5个进程
'''map是异步的'''
p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
p.close() #这个代表就是不能再往进程池里提交任务
p.join() #等待子进程执行完毕
end = time.time()
print(start-end)

开启多进程的两种方式以及效率对比

def task(i):
print(1)


if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
'''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
p = Pool(5) #定义进程池的数量,一次同时只能执行5个进程
'''map是异步的'''
p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
p.close() #这个代表就是不能再往进程池里提交任务
p.join() #等待子进程执行完毕
end = time.time()
print(end - start)

start = time.time()
p_l = []
for i in range(20):
p = Process(target=task,args=(i,))
p_l.append(p)
p.start()
for p in p_l:
p.join()
print(time.time() -start)

PS:进程池开启子进程任务的执行效率要高于for循环开启子进程的效率,因为进程池是根据CPU的数量+1来指定同时进程的数量,而for循环的底层原理是一次一次开启,所以效率没有进程池高

进程池了解知识

进程池apply方法

apply方法

import os
import random
import time
from multiprocessing import Pool


def task(i):
i += 1
print(i)
time.sleep(random.randint(1,3)) #用这个就可以看到是同步执行的


if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
p = Pool(5)
'''apply是同步的,并不是异步的,所以效率并不会很高'''
for i in range(20):
     '''apply里面有两个参数,一个是funcname(执行的函数名),一个是迭代对象'''
p.apply(task,args=(i,)) #这个就是同步的
end = time.time()
print(end - start)
apply_async方法

import os
import random
import time
from multiprocessing import Pool


def task(i):
i += 1
print(i)
time.sleep(random.randint(1,3))


if __name__ == '__main__':
start = time.time()
p = Pool(5)
res_l = []
'''apply_async是异步的'''
for i in range(20):
res = p.apply_async(task,args=(i,)) #这个方法就是把执行的结果值放入队列
res_l.append(res) #把值放入列表
for res in res_l: #for循环加get取值
res.get()
end = time.time()
print(end - start)

免责声明:文章转载自《(10)进程池》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DebugView图文教程zabbix安装注意以下几个部分下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

HP服务器设置iLO

HP Server Setting iLO Step 1.开机后出现界面-按F11进入BootMenu;2.选择GenericUSBBoot并输入;3.选择SystemConfiguration(系统配置)并按Enter键;4.选择iLO4ConfigurationUtility进入;5.选择NetworkOptions Enter将DHCPEnable设置...

"SQLserver 事务日志已满"解决方法

如果不够,备份后换个地方存[注:tempdb你数据库名称。...

【转】Kettle集群

本文转自:http://blog.csdn.net/dqswuyundong/article/details/5952009KettleCluster Kettle是一个开源ETL工具,以其效率和可扩展性而闻名于业界。其高效的一个重要原因是其多线程和集群功能。Kettle的多线程采用了管道并发机制,这在另一篇文章中专门介绍。本文主要介绍水壶集群。群集允许转换...

Innodb_large_prefix

但是,索引列的总长度不能超过3072字节的限制仍然存在...

Nohup后台运行程序

场景:我现在需要跑脚本批量处理一些数据,但是我又不想盯着控制台看这个脚本的输出结果,想把这些输出结果记录到一个日志文件里面方案:可以使用Linux的nohup命令,把进程挂起,后台执行用法:$nohupXXXXXX.sh˃˃/runtime/deletedata.log&运行结果(这个数字是进程号):˃˃[1]13120有时候可能会报一个提示:$no...

Vant 实现 上拉加载更多

Vant的List组件默认支持瀑布流滚动加载。官方的示例是用定时器模拟的数据。我们在项目实战中,肯定是结合ajax请求处理的。那么我们该如何实现这个效果呢?Vant的List组件使用方法这里就不详细说明了,官方文档已经写的很详细了。直接上项目中的实战代码://itemList换成你自己的数据//没数据时显示˂divclass="no-data"v-if="!...