python----多进程 apply(), apply_async()

python 大法好 apply(), apply_async()

今天早上起来学习的三个东西, 这里写写个, 本来想写在上一篇join()的学习记录里面的, 因为他们有点类似, 都可以阻塞程序, 但是不知道为什么我又突然想分开写了… …
先说一下他两的作用, 你们先理解一下他的工作方式:
apply(): 阻塞主进程, 并且一个一个按顺序地执行子进程, 等到全部子进程都执行完毕后 ,继续执行 apply()后面主进程的代码
apply_async() 非阻塞异步的, 他不会等待子进程执行完毕, 主进程会继续执行, 他会根据系统调度来进行进程切换
如果不能理解,我们就用代码来看看吧
先是使用apply()的代码

import time
import multiprocessing

def doIt(num):
	print("Process num is : %s" % num)
	time.sleep(1)
	print('process  %s end' % num)
if __name__ == '__main__':
	print('mainProcess start')
	#记录一下开始执行的时间
	start_time = time.time()
	#创建三个子进程
	pool = multiprocessing.Pool(3)
	print('Child start')
	for i in range(3):
		pool.apply(doIt,[i])
	print('mainProcess done time:%s s' % (time.time() - start_time))

执行结果 我们可以看到, 主进程开始执行之后, 创建的三个子进程也随即开始执行, 主进程被阻塞, 这里跟上一篇文章介绍的join() 很类似, 而且接下来三个子进程是一个接一个按顺序地执行, 等到子进程全部执行完毕之后, 主进程就会继续执行, 打印出最后一句,
在这里插入图片描述

接下来是使用apply_async(), 只需要把上面的代码使用 apply()的地方改成apply_async() 即可, 代码不再贴上
我们来看看运行结果 , 可以看出来, 截图的第一句是上一个程序的执行消耗时间, 最后一句是使用apply_async() 所消耗的时间, 在这里, 主进程没有被阻塞, 验证了他是非阻塞的, 子进程没有执行, 验证了他是根据系统调度完成的, 为什么会这样呢?
原因是, 进程的切换时操作系统控制的, 我们首先运行的是主进程, 而CPU运行得又很快, 快到还没等系统调度到子线程, 主线程就已经运行完毕了, 并且退出程序. 所以子进程就没有运行了.
在这里插入图片描述

那么 调用了apply_async() 是不是就不能运行子进程了呢, 肯定可以呀!!小老弟,想啥呢??
还记得上一篇join()告诉主进程老子要运行子进程就好呀, 还记得 join()的作用吗, 我们从上一篇介绍join()的文章可以知道他可以阻塞主进程, 等待所有子进程结束之后再运行, 我们在print('mainProcess done time:%s s' % (time.time() - start_time)) 执行之前加入两句代码

pool.close()
pool.join()

我们先要 close()一下子进程, 而且要先在 join() 前运行它,
我们看看加入这两句的运行结果, 我们可以看到即使是使用了非阻塞主进程的apply_async() 也能让子进程运行了, 在这里子进程按顺序交替运行了,
CPU在执行第一个子进程的时候, 还没等第一个子进程结束, 系统调度到了按顺序调度到了第二个子进程, 以此类推, 一直调度运行子进程, 一个接一个地结束子进程的运行, 最后运行主进程, 而且我们可以看到使用apply_async()的执行效力会更高, 你看一下他们各自执行结果最后一句的执行消耗时间就知道了, 这也是官方推荐我们使用apply_async()的主要原因吧
在这里插入图片描述

今天的学习记录就这些吧, 时间也不是很够用, 我想学习更多东西, 然后在这里记录积累,

不积跬步无以至千里

  • 37
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值