Python 进程池之非阻塞式

当需要创建的子进程数量不多时,可以直接利用multprocessing中的Process动态生成多个进程。但如果是上百甚至上千的目标,手动的去创建进程的工作量巨大,此时就可以用到multprocessing模块提供的Pool方法。初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,name就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大值,name该请求就会等待,知道池中有进程结束,才会创建新的进程来执行。
进程池
池子有两种类型:一种是阻塞式,一种是非阻塞式。
阻塞式:添加一个执行一个,执行一个才返回紧接着添加下一个。(没有特别大的意义)
非阻塞式:全部添加到队列中,立刻返回,并没有等待他们执行完毕,当执行完毕之后会有回调中携带它的结果。

程序1

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

def task(task_name):
    print('开始做任务了!',task_name)
    start = time.time()
    #使用sleep
    time.sleep(random()*2)
    end = time.time()
    print('完成任务用时:',(end-start))

if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
    for task in tasks:
        pool.apply_async(task,args = (task,))

    print('over!!!!!!!')
    

结果1

over!!!!!!!

程序2

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('完成任务!用时:',(end-start))

if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
    for task1 in tasks:
        pool.apply_async(task,args = (task1,))

    pool.close()    #添加任务结束
    pool.join()     

    print('over!!!!!!!')

结果2

开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务!用时: 0.5458700656890869
开始做任务了! 看孩子
完成任务!用时: 1.1073369979858398
开始做任务了! 读书
完成任务!用时: 0.3390927314758301
开始做任务了! 做饭
完成任务!用时: 1.6459546089172363
完成任务!用时: 1.871612310409546
完成任务!用时: 1.9256365299224854
完成任务!用时: 0.5086400508880615
完成任务!用时: 1.9110634326934814
over!!!!!!!

程序3

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

def task(task_name):
    print('开始做任务了!',task_name)
    start = time.time()
    #使用sleep
    time.sleep(random()*2)
    end = time.time()
    print('完成任务!用时:',(end-start),'进程ID:',os.getpid())       #获得进程ID

if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
    for task1 in tasks:
        pool.apply_async(task,args = (task1,))

    pool.close()    #添加任务结束
    pool.join()     #

    print('over!!!!!!!')

结果3

开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务!用时: 0.18909358978271484 进程ID: 10544
开始做任务了! 看孩子
完成任务!用时: 0.4931068420410156 进程ID: 7024
开始做任务了! 读书
完成任务!用时: 0.6347644329071045 进程ID: 5472
开始做任务了! 做饭
完成任务!用时: 0.5653088092803955 进程ID: 10544
完成任务!用时: 0.20141983032226562 进程ID: 5472
完成任务!用时: 1.348006010055542 进程ID: 6612
完成任务!用时: 1.0501861572265625 进程ID: 7024
完成任务!用时: 1.6761057376861572 进程ID: 18536
over!!!!!!!

程序4

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

def task(task_name):
    print('开始做任务了!',task_name)
    start = time.time()
    #使用sleep
    time.sleep(random()*2)
    end = time.time()
    print('完成任务:{}!用时:{},进程ID:{}'.format(task_name,(end - start),os.getpid()))

if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','读书','做饭']
    for task1 in tasks:
        pool.apply_async(task,args = (task1,))

    pool.close()    #添加任务结束
    pool.join()     #

    print('over!!!!!!!')

结果4

开始做任务了! 听音乐
开始做任务了! 吃饭
开始做任务了! 洗衣服
开始做任务了! 打游戏
开始做任务了! 散步
完成任务:打游戏!用时:0.39394688606262207,进程ID:6652
开始做任务了! 看孩子
完成任务:散步!用时:0.8889727592468262,进程ID:22576
开始做任务了! 读书
完成任务:听音乐!用时:1.1549112796783447,进程ID:19264
开始做任务了! 做饭
完成任务:洗衣服!用时:1.7190024852752686,进程ID:1332
完成任务:读书!用时:0.7781314849853516,进程ID:22576
完成任务:吃饭!用时:1.89725661277771,进程ID:9196
完成任务:看孩子!用时:1.9234998226165771,进程ID:6652
完成任务:做饭!用时:1.804778814315796,进程ID:19264
over!!!!!!!

进程分析

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值