Python多进程之multiprocessing模块和进程池的实现
1、利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似
'''
代码是由主进程里面的主线程从上到下执行的,
我们在主线程里面又创建了两个子进程,子进
程里面也是子线程在干活,这个子进程在主进
程里面
'''
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、进程之间默认是不能共用内存的
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方法
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模块的使用,每个任务是排队执行的
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模块多个回调函数,同时是异步的
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'''
结果如图
这两个方法的主要区别如图

Python多进程之multiprocessing模块和进程池的实现的更多相关文章
- 多进程之multiprocessing模块和进程池的实现
转载:https://www.cnblogs.com/xiaobeibei26/p/6484849.html Python多进程之multiprocessing模块和进程池的实现 1.利用multip ...
- 多进程之multiprocessing模块、守护进程、互斥锁
目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...
- 进程之multiprocessing模块代码篇
这里再把之前的内容总结和补充一下: 并发和并行: 你在干坏事,来了一个电话,干完坏事再去接电话,说明你既不是并发也不是并行. 你在干坏事,来了一个电话,你接完电话接着干坏事,说明你支持并发 你在干坏事 ...
- python多进程之multiprocessing
什么是多进程? 简单的理解:单板上运行的一个程序就是一个进程.进程是操作系统分配资源的最小单位,不同的进程之间资源不共享,进程间通信需要使用特定的方式.python提供了自带的multiprocess ...
- python并发编程之multiprocessing进程(二)
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...
- python并发编程之Queue线程、进程、协程通信(五)
单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- 使用multiprocessing模块操作进程
1.Process模块介绍 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. Process([group [, target [, name [, args [, kwa ...
- Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...
随机推荐
- 在vue-cli中引入外部插件
一.可以用npm下载的 现在以jquery为例子: 1 先在package.json中的dependencies中写入“jquery”:“^3.2.1”(jquery版本) 2 在npm中搜索jque ...
- linux 命令——34 du(转)
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
- linux 命令——14 head (转)
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...
- iOS 不同的崩溃类型
http://m.blog.csdn.net/kangguang/article/details/62501490 用汇编语言编写的软件跟用脚本或标记语言编写的Web应用的差别在于,前者在出现问题时会 ...
- 文件系统 - Linux 支持的文件系统类型
NAME 文件系统 - Linux 支持的文件系统类型:minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sy ...
- python 多进程简单调用
python 多进程简 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/28 10:03 # so ...
- mongdb 一些操作
一.命令操作数据库1.管理员身份打开cmd2.进到mongdb的mongo.exe文件所在路径3.show dbs 查看mongodb4.连接远程数据库:mongo ip:端口/数据库5.打开某个数据 ...
- swiper动画效果
参考swiper官方网站:http://www.swiper.com.cn/ Swiper常用于移动端网站的内容触摸滑动: 结构展示: 纯javascript打造的滑动特效插件,面向手机.平板电脑 ...
- 廖老师git教程执行"git checkout -b dev origin/dev"命令报出:fatal: Cannot update paths and switch to branch 'dev' at the same time. Did you intend to checkout 'origin/dev' which can not be resolved as commit?问题解决
在学习廖老师git教程之多人协作模块时按照老师的操作先创建了另一个目录,然后在这个目录下从GitHub上clone了 learngit目录到这个目录下,同样的执行了git branch查看分支情况,确 ...
- Ubuntu12.04下YouCompleteMe安装教程(部分)
1.通过源码编译安装VIM 开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载 ...