python进程池apply与apply_async

进程池Pool中的apply方法与apply_async的区别

apply方法是阻塞的。
意思就是等待当前子进程执行完毕后,在执行下一个进程。
示例apply的应用方法

import time
from multiprocessing import Pool
def run(msg):
    print('msg:%s'%msg)
    # 程序随眠3秒,
    time.sleep(3)
    print('end')
if __name__=="__main__":
    print("开始执行主程序")
    start_time=time.time()
    # 使用进程池创建子进程
    size=3
    pool=Pool(size)
    print("开始执行子进程")
    for i in range(size):
        pool.apply(run,(i,))
    print("主进程结束耗时%s"%(time.time()-start_time))

程序的执行结果:

开始执行主程序
开始执行子进程
msg:0
end
msg:1
end
msg:2
end
主进程结束耗时9.048467874526978

apply_async是异步非阻塞的。
意思就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

applay基本忽略,达不到多进程效果。apply_async属于异步,主进程和子进程同时跑,谁跑的快,谁先。
apply_async代码实现多进程耗时

import time
from multiprocessing import Pool
def run(msg):
    print('msg:%s'%msg)
    # 程序随眠3秒,
    time.sleep(3)
    print('end')
if __name__=="__main__":
    print("开始执行主程序")
    start_time=time.time()
    # 使用进程池创建子进程
    size=3
    pool=Pool(size)
    print("开始执行子进程")
    for i in range(size):
        pool.apply_async(run,(i,))
    print("主进程结束耗时%s"%(time.time()-start_time))

程序运行的结果

开始执行主程序
开始执行子进程
主进程结束耗时0.033245086669921875

为何apply和apply_async时间上这两个会差距这么多呢,
对于你设置的时间等待的3秒为何apply_async总的时间运行还没有0.1秒呢
答案抛出:
因为进程的切换是操作系统来控制的,抢占式的切换模式。
我们首先运行的是主进程,cpu运行很快啊,这短短的几行代码,完全没有给操作系统进程切换的机会,主进程就运行完毕了,整个程序结束。子进程完全没有机会切换到程序就已经结束了。

阻塞式的apply

首先主进程开始运行,碰到子进程,操作系统切换到子进程,等待子进程运行结束后,在切换到另外一个子进程,直到所有子进程运行完毕。然后在切换到主进程,运行剩余的部分。

异步非阻塞式的apply_async

首先主进程开始运行,碰到子进程后,主进程说:让我先运行个够,等到操作系统进行进程切换的时候,在交给子进程运行。以为我们的程序太短,然而还没等到操作系统进行进程切换,主进程就运行完毕了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值