织梦做的网站首页排版错误,巨鹿网站建设设计,国外服务器下载,购物网站个人中心模板池的介绍#xff1a;
提前创建进程池#xff0c;防止创建的进程数量过多导致系统性能受到影响#xff0c;在系统执行任务时#xff0c;系统会使用池中已经创建进程/线程#xff0c;从而防止资源的浪费#xff0c;创建的进程/线程可以让多个进程使用#xff0c;从而降低…池的介绍
提前创建进程池防止创建的进程数量过多导致系统性能受到影响在系统执行任务时系统会使用池中已经创建进程/线程从而防止资源的浪费创建的进程/线程可以让多个进程使用从而降低了操作系统的负担加快了系统执行的效率
若果不创建进程池可能会导致任务建立的进程数量过多影响系统并且在执行不同任务时还会重新进行进程的创建导致资源的浪费 池的使用
进程池
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(targetfunc,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(targetfunc,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数量的五倍