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

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/

原文发布于微信公众号 - AI深度学习求索(AIDeepLearningQ)

原文发表时间:2018-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术记录

通讯协议序列化解读(二) protostuff详解教程

36840
来自专栏杂七杂八

列表、字典、集合中筛选数据

传统迭代法 data = [1,5,-3,-2,8,0,9] res = [] for x in data: if x >=0: res...

38960
来自专栏机器学习算法与理论

QT生成动态链接库.so文件

首先是新建一个工程,选择C++库,打开后是这样的4 ? 然后输入新建的名称,下一步,记得勾选Qtcore那个(就是默认的那个),否则编译似乎不能通过。因为后面自...

92390
来自专栏JMCui

Linux 学习记录 四(Bash 和 Shell scirpt).

一、什么是 Shell?        狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,...

42340
来自专栏电光石火

关于PHP字符编码的函数区别

在以前的学习当中,比方说有一次的写采集过程中转换字符的编码的时候老是失败,转换的结果总没有完全输出,后来经过网络查询得知是iconv有一个“-”漏洞,所以我们有...

26980
来自专栏北京马哥教育

15分钟学会shell脚本,最简明的教程在这里

本文由马哥教育M23期学员推荐,转载自互联网,作者为Hnongy,感谢作者的辛苦付出和贡献。 Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的...

32270
来自专栏博客园

Asp.Net Web API(三)

    在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action。当We...

18750
来自专栏阮一峰的网络日志

Javascript 严格模式详解

一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更...

29980
来自专栏静默虚空的博客

Java中的访问控制权限

简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属...

28690
来自专栏magicsoar

HHVM源码剖析

一、前言 hhvm源码中充满了很多C++11的新特性,并且使用了各种设计模式如工厂,模板方法等,利用智能指针包裹指针,让delete没有肆意的出现 模板,继承,...

24580

扫码关注云+社区

领取腾讯云代金券