江湖小白之一起学Python (八)进程池的运用

学习使我快乐…… 接着上篇的讲,上篇我们简单了介绍了多线程的运用,其实在python中多线程是假的多线程,为什么这么说呢,因为python的解释器在同一时刻只允许一个线程执行,不管你电脑有几个核,单位时间多个核只能跑一个线程,然后时间片轮转,其实可以理解为在python的多线程是单核多线程,没有完全利用电脑多核的资源,根本的原因是由全局解释器锁(GIL)引起的,要真正利用多核,除非重写一个不带GIL的解释器,有兴趣的童鞋可以用多线程写个无限循环压力测试看看CPU的运行情况,是否占满了100%。

what? 那我们在python中利用多核怎么办?所以就有了今天这篇进程池的运用……

python中调用进程池我们要引入对应的库及方法:

from multiprocessing import Pool

首先我们还是跟多线程一样定义一个run的方法:

#执行方法
def run(n):
    time.sleep(1)
    print("我是方法:{}".format(n))

为了观察方便,我们还是加入了延迟1秒,我们先定义一下进程池:

pool = Pool(processes=4)

processes这个参数表示的工作进程的个数,这个数值是由你电脑的CPU个数决定的,一般这个参数是小于或等于这个CPU数的,如果设置的过大,反而会执行更慢。上面的意思是一次执行4个进程,只要任务没完,哪个进程先执行完就往这个进程加入新的任务,接下来我们循环生成10个任务:

for i in range(10):
    pool.apply_async(func=run, args=(i, ))

这里参数的方法跟多线程的方法基本类似,主要就是pool加入进程的方法,下面列举下一般使用的方式:

1.   apply      (阻塞式的,效果就是跟单进程依次循环一样)这个意思就是等待当前子进程执行完毕后,在执行下一个进程,个人感觉没啥用~~!

2.   apply_async  (异步非阻塞式) 这个就是用得最多了,意思就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

3.   map         这个顾名思义,就是以map函数的形式传递参数,通常是数组的形式,比如:

pool.map(func=run,iterable=range(10))
#或者简写为:
pool.map(run,range(10))

4.   map_async   同理这个是map函数以异步非阻塞的形式

apply_async主要是将参数逐个的加入到进程中,平常经常会用到这个,因为这种方式方便实现一些逻辑代码,下来来个完整的代码:

#coding:utf-8
import time
from multiprocessing import Pool

#执行方法
def run(n):
    time.sleep(1)
    print("我是方法:{}".format(n))

#注意:这里的进程池pool对象定义一定要放在main主模块下
if __name__ == '__main__':
    #定义进程池
    pool = Pool(processes=4)
    for i in range(10):
        pool.apply_async(func=run, args=(i,))
        #简写: pool.apply_async(run, (i,))
    pool.close()   #关闭进程池,不在让往进程池中添加进程
    pool.join()    #等待进程池中的所有进程执行完毕,必须在close()之后调用

好了,到这里,进程池的基本用法就这样了,这样就通过多进程实现了多核任务,尽量利用计算机的性能资源。后面有兴趣的同学还可以自己去了解下多线程与多进程的区别,还有就是协程的用法及优缺点,在这里我就不再过多的讲述了。

认真的时间总是过得这么快,赶紧动手操作一下看看结果吧!

江湖不说再见,咱们下篇见!

关注公众号,一起来提高自己吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值