前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AI实践:如何应用多进程Multiprocessing编程?

AI实践:如何应用多进程Multiprocessing编程?

作者头像
AI深度学习求索
发布2018-12-11 16:57:22
1.1K0
发布2018-12-11 16:57:22
举报
文章被收录于专栏:AI深度学习求索

multiprocessing和threading:

多线程 threading:计算机同一时间还是只能处理一个线程

多核 multiprocessing:现在计算机都有多核处理器,将任务分给多个核来处理,他们有单独的运算空间和计算能力,避免了多线程的劣势。

导入包:

定义一个被线程和进程调用的函数

创建进程和线程

Queue功能:

Queue的功能是将每个核或线程的运算结果放在队里中, 等到每个线程或核运行完毕后再从队列中取出结果, 继续加载运算。原因很简单, 多线程调用的函数不能有返回值, 所以使用Queue存储多个线程运算的结果

定义一个被多线程调用的函数,q就像一个队列,用来保存每次函数运行的结果

主函数:

效率比较:多线程、多进程、普通的消耗时间;

实际时间对比:

运行时间是 多进程 < 普通 < 多线程

进程池就是我们将所要运行的东西,放到池子里,Python会自行解决多进程的问题。

导入包并定义函数:

有了池子之后,就可以让池子对应某一个函数,向池子里输入数据,池子就会返回函数返回的值。

Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。

接下来用map()获取结果,在map()中需要放入函数和需要迭代运算的值,然后它会自动分配给CPU所有核,返回结果。

除了map()函数,Pool还有apply_async()函数可以返回结果。apply_async()中只能传递一个值,只会放入一个核进行运算,传入值时要注意是可迭代的,所以在传入值后需要加逗号。

如何用apply_async()输出多个迭代呢?多传入几个值试试~

合并代码:

可以看出在apply用迭代器的得到的结果和用map得到的结果是一样的

总结

1. Pool默认调用是CPU的核数,传入processes参数可自定义CPU核数

2. map() 放入迭代参数,返回多个结果

3. apply_async()只能放入一组参数,并返回一个结果,如果想得到map()的效果需要通过迭代。

只有用共享内存才能让CPU之间有交流。

Shared Value:(多线程中global value)

多进程,即使传入global 变量,多进程中也无法交流,我们可以通过使用Value数据存储在一个共享的内存表中。

Shared Array:(仅仅是一个一维列表)

这里的Array和numpy中的不同,它只能是一维的,不能是多维的。

同样和Value 一样,需要定义数据形式,否则会报错。

参考数据形式

各参数代表的数据类型

进程锁的运用:使进程之间不会互相干扰

不加进程锁

在上面的代码中,我们定义了一个共享变量v,两个进程都可以对它进行操作。 在job()中我们想让v每隔0.1秒输出一次累加num的结果,但是在两个进程p1和p2 中设定了不同的累加值。所以接下来让我们来看下这两个进程是否会出现冲突。

运行一下:

145891213161720

我们可以看到,进程1和进程2在相互抢着使用共享内存v。

加进程锁

为了解决上述不同进程抢共享资源的问题,我们可以用加进程锁来解决。

首先需要定义一个进程锁

然后将进程锁的信息传入各个进程中

在job()中设置进程锁的使用,保证运行时一个进程的对锁内内容的独占

完整代码:

运行一下,让我们看看是否还会出现抢占资源的情况:

12345811141720

显然,进程锁保证了进程p1的完整运行,然后才进行了进程p2的运行

参考自:莫烦python https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI深度学习求索 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档