多进程之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 | '''代码是由主进程里面的主线程从上到下执行的,我们在主线程里面又创建了两个子进程,子进程里面也是子线程在干活,这个子进程在主进程里面'''importmultiprocessingimporttimedeff0(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 =[]deff1(i):    li.append(i)    print('你好',li)if__name__ =='__main__':#进程不能共用内存    fori inrange(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 | frommultiprocessing importProcessfrommultiprocessing importManagerdeff1(i,dic):    dic[i] =200+i    print(dic.values())if__name__ =='__main__':#进程间默认不能共用内存    manager =Manager()    dic =manager.dict()#这是一个特殊的字典    fori inrange(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 | frommultiprocessing importProcess,Poolfrommultiprocessing importManagerimporttimedeff1(a):    time.sleep(2)    print(a)if__name__ =='__main__':    pool =Pool(5)    fori inrange(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 | frommultiprocessing importProcess,Poolfrommultiprocessing importManagerimporttimedefFoo(i):    time.sleep(1)    returni+50defBar(arg):    print(arg)if__name__ =='__main__':    pool =Pool(5)    fori inrange(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 ... 
随机推荐
- ios -转载-真机提示 iPhone has denied the launch request 问题
			环境: 手机版本12.1,Xcode10.0问题: 真机时提示 iPhone has denied the launch request ,试过了的各种方法,最终解决方法如下:1. 2. 3.清理Xc ... 
- Linux命令之iptables
			从CentOS7开始,系统自带的防火墙更改为firewalld,但同样支持iptables,不过只有iptables命令,如果想要使用iptables服务需要自行安装iptables-server. ... 
- UICollectionview的头视图和尾视图
			UITableView有头视图和尾视图,那么UICollectionView有没有头视图和尾视图呢? 答案是有的. 1.新建一个类,必须继承自 UICollectionReusableView. 2. ... 
- python多线程、线程锁
			1.python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1.func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也 ... 
- swift 第八课  CollectView的 添加 footerView 、headerView
			collectView 也是 iOS 很常用的瀑布流展示控件了,虽然使用过很多次,一直没有系统的总结过,尤其是在添加header 和footer view 的时候,很常见,写起来总觉得不是很流畅,这里 ... 
- (转)svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”
			今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrup ... 
- from提交数据,高级选择器,伪类选择器,前端样式等
			1. form提交数据 get: 不安全的提交数据,高效 post: 安全的提交数据,低效 前台都可以给后台提交数据,后台一定会给前台一个反馈结果 2. 高级选择器 <!DOCTYPE html ... 
- eNSP——通过Stelnet登录系统
			Stelnet的原理 由于Telnet缺少安全的认证方式,而且传输过程采用TCP进行明文传输,存在很大的安全隐患,单纯提供Telnet服务容易招致主机IP地址欺骗.路由欺骗等恶意攻击.传统的Telne ... 
- qt坐标系统见解
			窗口坐标为逻辑坐标,是基于视口坐标系的. 视口坐标为物理坐标,是基于绘图设备坐标系的 窗口坐标始终以视口坐标为最终目标进行映射: QPainter::setWindow 修改了窗口位置和大小(左上角重 ... 
- oauth2中org.springframework.security.core.userdetails.User无法转换为封装的AuthorizationInfoBean
			用springboot + oauth2 + redis搭建了一个项目,创建一个自定义的AuthorizationInfoBean继承org.springframework.security.core ... 
