自学内容网 自学内容网

Python 笔记之进程池Pool


当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程
但是如果是上百个或者上千个目标,手动去创建进程的工作量很大,此时就可以利用到Multiprocessing模块提供的Pool方法
初始化pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满
那么就会创建一个新的进程来执行该请求;但是如果池中的进程数量已经达到指定的最大值,那么该请求会等待
直到池中有进程结束,才会创建新的进程来执行
阻塞式:
非阻塞式:全部添加到队列中,立刻返回,并没有等待其它进程执行完毕,但是回调函数是等地啊任务完成之后才调用。
好处:设置进程数量,达到进程的复用

import os
from multiprocessing import Pool
#非阻塞式进程
import time
from random import random

def task(task_name):
    print('开始做任务',task_name)
    start=time.time()
    #使用sleep
    time.sleep(random()*2)
    end=time.time()
    # print(f'{task_name}完成任务用时:',(end-start),'进程id:',os.getpid())
    return(f'{task_name}完成任务用时:',(end-start),'进程id:',os.getpid())
container=[]
def callback_func(n):
    # print(n)
    container.append(n)
if __name__ == '__main__':
    pool1=Pool(5)
    tasks=['听音乐','洗衣服','散步','看孩子','做饭','吃饭','洗碗','拖地']
    for i in range(8):
        pool1.apply_async(task,args=(tasks[i],),callback=callback_func)#async 非阻塞
    pool1.close()#添加任务结束
    pool1.join()#堵住主进程,插队
    for i in container:
        print(i)
    print('over!!')

阻塞式:添加一个任务执行一个任务,如果一个任务不结束,宁一个就进不来

if __name__ == '__main__':
    pool1=Pool(5)
    tasks=['听音乐','洗衣服','散步','看孩子','做饭','吃饭','洗碗','拖地']
    for i in range(8):
        pool1.apply(task,args=(tasks[i],))#async 非阻塞
    pool1.close()#添加任务结束
    pool1.join()#堵住主进程,插队
    for i in container:
        print(i)
    print('over!!')


原文地址:https://blog.csdn.net/Katherine1029/article/details/143926397

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!