多进程之multiprocessing模块和进程池的实现
转载:https://www.cnblogs.com/xiaobeibei26/p/6484849.html
Python多进程之multiprocessing模块和进程池的实现
1、利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
''' 代码是由主进程里面的主线程从上到下执行的, 我们在主线程里面又创建了两个子进程,子进 程里面也是子线程在干活,这个子进程在主进 程里面 ''' import multiprocessing import time def f0(a1): time.sleep( 3 ) print (a1) if __name__ = = '__main__' : #windows下必须加这句 t = multiprocessing.Process(target = f0,args = ( 12 ,)) t.daemon = True #将daemon设置为True,则主线程不比等待子进程,主线程结束则所有结束 t.start() t2 = multiprocessing.Process(target = f0, args = ( 13 ,)) t2.daemon = True t2.start() print ( 'end' ) #默认情况下等待所有子进程结束,主进程才结束 |
这里的结果是直接打印出end就结束了,因为添加了t.daemon=True,join方法在进程里面也可以用,跟线程的用法非常相似
2、进程之间默认是不能共用内存的
1
2
3
4
5
6
7
8
9
10
11
12
13
|
li = [] def f1(i): li.append(i) print ( '你好' ,li) if __name__ = = '__main__' : #进程不能共用内存 for i in range ( 10 ): p = Process(target = f1,args = (i,)) p.start() '''每个进程都创建一个列表,然后添加一个因素进去, 每个进程之间的数据是不能共享的 |
结果如图
如果将代码改成threading,由于线程共用内存,所以结果是不一样的,线程操作列表li之前,拿到的是前一个线程操作过的li列表,如图
3、如果要进程之间处理同一个数据,可以运用数组以及进程里面的manager方法,下面代码介绍的是manager方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from multiprocessing import Process from multiprocessing import Manager def f1(i,dic): dic[i] = 200 + i print (dic.values()) if __name__ = = '__main__' : #进程间默认不能共用内存 manager = Manager() dic = manager. dict () #这是一个特殊的字典 for i in range ( 10 ): p = Process(target = f1,args = (i,dic)) p.start() p.join() |
这里输出如图,表示每个进程都是操作这个字典,最后的输出是有10个元素
如果是普通的字典,输出如图
4、multiprocessing模块里面的进程池Pool的使用
(1)apply模块的使用,每个任务是排队执行的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from multiprocessing import Process,Pool from multiprocessing import Manager import time def f1(a): time.sleep( 2 ) print (a) if __name__ = = '__main__' : pool = Pool( 5 ) for i in range ( 5 ): #每次使用的时候会去进程池里面申请一个进程 pool. apply (func = f1,args = (i,)) print ( '你好' ) #apply里面是每个进程执行完毕了才执行下一个进程 pool.close() #执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束 pool.join() #等待进程运行完毕,先调用close函数,否则会出错 |
运行结果如图
(2)apply_async模块,会比apply模块多个回调函数,同时是异步的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from multiprocessing import Process,Pool from multiprocessing import Manager import time def Foo(i): time.sleep( 1 ) return i + 50 def Bar(arg): print (arg) if __name__ = = '__main__' : pool = Pool( 5 ) for i in range ( 10 ): '''apply是去简单的去执行,而apply_async是执行完毕之后可以执行一 个回调函数,起提示作用''' pool.apply_async(func = Foo,args = (i,),callback = Bar) #是异步的 print ( '你好' ) pool.close() #不执行close会报错,因为join的源码里面有个断言会检验是否执行了该方法 pool.join() #等待所有子进程运行完毕,否则的话由于apply_async里面daemon是设置为True的,主进程不会等子进程,所欲函数可能会来不及执行完毕就结束了 '''apply_async里面,等函数Foo执行完毕,它的返回结果会被当做参数 传给Bar''' |
结果如图
这两个方法的主要区别如图
多进程之multiprocessing模块和进程池的实现的更多相关文章
- Python多进程之multiprocessing模块和进程池的实现
1.利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似 ''' 代码是由主进程里面的主线程从上到下执行 ...
- 多进程之multiprocessing模块、守护进程、互斥锁
目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...
- 进程之multiprocessing模块代码篇
这里再把之前的内容总结和补充一下: 并发和并行: 你在干坏事,来了一个电话,干完坏事再去接电话,说明你既不是并发也不是并行. 你在干坏事,来了一个电话,你接完电话接着干坏事,说明你支持并发 你在干坏事 ...
- Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...
- 进程之multiprocessing
进程的状态:
- python-day37--concurrent.futures模块 实现进程池与线程池
1.concurrent.futures模块 直接内置就是 异步的提交 ,如果你想同步也可以实现(p.submit(task,i).result()即同步执行) 2.属性和方法: 1.submit ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- 使用multiprocessing模块操作进程
1.Process模块介绍 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. Process([group [, target [, name [, args [, kwa ...
- 使用multiprocessing模块创建进程
#_author:来童星#date:2019/12/17from multiprocessing import Processimport timeimport os#两个子进程将会调用的两个方法de ...
随机推荐
- Cloudera Manager 概念
cloudera公司发布的CDH集群,使用Cloudera Manager来管理整个集群,使用过程中主要涉及到几个关键概念:cluster.service.role.host.直接上图,直观理解几个概 ...
- php-fpm 优化
/usr/local/php/etc/php-fpm.conf 优化 [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /us ...
- RocketMQ采坑记
先来一篇解释比较多的实例 https://www.cnblogs.com/super-d2/p/4154541.html No route info of this topic, PushTopic ...
- 【ARTS】01_25_左耳听风-201900429~20190505
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- (IStool)软件打包时当文件存在时不覆盖文件(配置文件)
需求:程序实际使用过程中有些配置信息是需要用户手动配置的,不同客户使用配置信息也不同,所以软件发布前需要考虑这个问题,覆盖安装时需要忽略这些配置文件 实现:当对应的目录下由此文件的时候不覆盖此文件 [ ...
- 设计模式七大原则(C++描述)
前言 最近在学习一些基本的设计模式,发现很多博客都是写了六个原则,但我认为有7个原则,并且我认为在编码中思想还是挺重要,所以写下一篇博客来总结下 之后有机会会写下一些设计模式的博客(咕咕咕...... ...
- 小米 9 SE 获取Root 和 安装Magisk
1.刷入第三方REC 和 Magisk 参考教程:[LR.Team]小米9SE专版TWRP中英文修改优化版_小米9 SE_MIUI论坛 使用上面的工具,傻瓜式操作即可. 关于刷入成功之后的说明:刷入成 ...
- c语言深度解剖(笔记)
1.1最宽恒大量的关键字----auto 函数内部变量,限制作用域为这个 1.2.1最快的关键字---- register函数. 关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中 1.2.2使 ...
- 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理
目录 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理 17.1 计划任务-at-cron-计划任务使用方法 17.1.1 at计划任务的使用 17.1.2 查看和删除at将要执行 ...
- C++11 thread condition_variable mutex 综合使用
#include <mutex> #include <condition_variable> #include <chrono> #include <thre ...