python 多进程之进程池(阻塞非阻塞callback通信队列)

1.阻塞式进程池

// 
#阻塞式
#特点:
#   添加一个执行一个,加一个来一个,如果一个任务不结束另一个任务就进不来
#
#进程池:
#   pool=Pool(max)  创建进程池对象
#   pool.apply()    阻塞式进程
#   pool.apply_async()   非阻塞式
#
#   pool.close()  停止添加新的子进程
#   pool.join()   让主进程让步,让子进程完成后再主进程

//
from multiprocessing import Pool
import time
import random
import os
def task(name):
    print('我开始做任务了'+name)
    start=time.time()

    time.sleep(random.random()*2)
    end=time.time()
    print('完成任务:{}用时:{},进程id:{}'.format(name,end-start,os.getpid()))


# container=[]
# def callback_func(n):
#     container.append(n)

if __name__ == '__main__':
    pool=Pool(5)
    tasks=['听音乐','吃饭','洗衣服','打游戏','五号任务','第六号任务','七号任务','八号任务']
    for i in tasks:
        pool.apply(task,args=(i,))  #apply是阻塞式,阻塞式不需要回调函数,因为他是执行完一个才进行下一个
    pool.close()
    print('over!!!!!!')

结果为
我开始做任务了听音乐
完成任务:听音乐用时:1.6573665142059326,进程id:25144
我开始做任务了吃饭
完成任务:吃饭用时:1.1927132606506348,进程id:9456
我开始做任务了洗衣服
完成任务:洗衣服用时:0.5656704902648926,进程id:26388
我开始做任务了打游戏
完成任务:打游戏用时:0.9807431697845459,进程id:17268
我开始做任务了五号任务
完成任务:五号任务用时:0.5586028099060059,进程id:14632
我开始做任务了第六号任务
完成任务:第六号任务用时:0.3072090148925781,进程id:25144
我开始做任务了七号任务
完成任务:七号任务用时:1.1672744750976562,进程id:9456
我开始做任务了八号任务
完成任务:八号任务用时:1.5571136474609375,进程id:26388
over!!!!!!

2.进程池之非阻塞式

//
#当需要创建子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程
#但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,这时候用multiprocessing模块中的Pool
#初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中,如果池中的进程数已经达到指定最大值,那么该进程就会等待,
知道池中有进程结束,才会创建新的进程来执行
#进程池的优点:进程池的限制,进程的复用

#Pool可以创建进程池,分阻塞式和非阻塞式
#阻塞式:添加一个执行一个,执
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值