python multiprocess——多进程加速

1. 前言

现在cpu动不动就是6核12进程,计算能力越来越强,但是我们真的都用上了么?在跑python代码时,请打开你的后台监控,看看python的CPU占比。如果不做特殊处理(排除你调用的库),很有可能你的代码最高只能占用100%,资源利用率低下。

还有另外一个故事,当你的计算复杂度很高的时候,比如处理某些大文件,如果你只用一个进程,很有可能得跑24小时,为了加速,你就得想办法把你的计算资源用起来,想办法并行运算。那么python什么库是来帮助我们进行并行计算的呢?

有请我们的multiprocess同学来发表获奖感言,“感谢cctv,感谢铁岭tv…”

2. multiprocess详解

multiprocess提供了两个类来实现多进程计算

2.1 Process

  • 初始化 ,__init__(self, group=None, target=None, name=None, args=(), kwargs={}) 其中group分组,通常不用;target是要执行的函数;name名称;args表示给函数传递的参数
def do(i):
	print(f"我是进程小{i} 我为自己带盐!")

for i in range(3):
	p = Processor(target=do, args=(i, ), name=f"work_{i}")
	p.start()
  • 参数共享,python每次开启一个子进程,通常是把数据复制到子进程,不同进程之间没有参数共享。mutliprocess提供了一些类来实现参数共享,包括Array、Manager和Queue。个人在进行人文分类任务时,读取大训练集合的时候喜欢用到Queue来实现参数共享,参考一下代码[1] 。
import multiprocessing
from multiprocessing import Process
from multiprocessing import Queue

def func(i, q):
    ret = q.get()
    print("进程%s从队列里获取了一个%s,然后又向队列里放入了一个%s" % (i, ret, i))
    q.put(i)

if __name__ == "__main__":
    lis = Queue(20)
    lis.put(0) # 往lis中压入
    for i in range(10):
        p = Process(target=func, args=(i, lis,))
        p.sta

使用Queue的优势,制定一个有限长队列,消费完成后可以销毁,这样内存消耗就有限,遇到几百G大的训练数据,可以不用一次性加载,但是因为要并行,可以通过多进程把部分读如队列里面,然后你进行多进程消费。

2.2 Pool (进程池)

进程池方法是个人最早接触的方法,感觉特别简单,你只要开启进程池,然后借助map方法,分分钟实现多进程。

from multiprocessing import Pool
def do(name):
	print(f"hello {name}")

name_list = ["liming", "hanmeimei", "xiaogang"]
pool = Pool(3) # 制定要开启的进程数, 限定了进程上限
pool.map(do, name_list)
pool.close()
pool.join()

是不是很简单,除了map方法,Pool还有apply、apply_async 、map_async方法,不一一解说,大家可以参考[2、3]。

写在最后

当你的代码慢到阻碍你幸福生活的时候,请想办法加速!如果你用的是python,请记起你的老朋友——multiprocess!

名词解释

  • 同步,调用方和被调用方结果一起返回
  • 异步,调用方返回但是被调用方结果还没有返回
  • 阻塞,阻塞调用是指调用结果返回之前,当前线程会被挂起
  • 非阻塞,非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

参考

  1. https://www.liujiangblog.com/course/python/82 (Process)
  2. https://www.cnblogs.com/ailiailan/p/11850710.html (multiprocessing.Pool)
  3. https://www.cnblogs.com/nickchen121/p/11130258.html (multiprocessing.Pool)
  4. https://www.cnblogs.com/loveer/p/11479249.html
  5. https://www.zhihu.com/question/19732473
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘记开挂的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值