多进程之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 multiprocessingimport timedef 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 Processfrom multiprocessing import Managerdef 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,Poolfrom multiprocessing import Managerimport timedef 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,Poolfrom multiprocessing import Managerimport timedef Foo(i): time.sleep(1) return i+50def 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 ...
随机推荐
- python 内置数据结构 字符串
字符串 一个个字符组成的有序的序列,是字符的集合 使用单引号,双引号,三引号引住的字符序列 字符串是不可变对象 Python3起,字符串就是Unicode类型 字符串定义 初始化 s1 = 'stri ...
- 解决zabbix中文乱码问题
进入Windows系统控制面板-->外观和个性化-->字体(选择一个字体文件simsun.ttc复制)进入zabbix的web服务器[root@test-zabbix]# cd ~/zab ...
- 最新 美图java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.美图等10家互联网公司的校招Offer,因为某些自身原因最终选择了美图.6.7月主要是做系统复习.项目复盘.LeetCode ...
- PowerPoint储存此文件时发生错误 出现错误的问题解决方法
.单击“文件”,单击“选项”,然后单击“加载项”. . 在管理下拉框中选择“COM加载项”,单击“转到”按钮. . 检查是否存在有任何加载项,清除所有复选框来禁用它们. . 关闭PPT并重新启动,测试 ...
- 【AtCoder】AGC011
AGC011 A - Airport Bus 大意:有N个人,每个人只能在\([T_i,T_i +K]\)这段区间乘车,每辆车安排C人,问最少安排几辆车 直接扫,遇到一个没有车的在\(T_i +K\) ...
- Python解Leetcode: 226. Invert Binary Tree
leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...
- (七)Spring 配置 c3p0 连接池
目录 在 Spring 核心配置文件中配置 c3p0 连接池 配置 JdbcTemplate 对象 在 service 层注入 userDao 在 UserDao 里面注入 JdbcTemplate ...
- git太慢用码云
克隆完之后,我们要对这个仓库进行下修改,将仓库地址修改为git的那个 git remote set-url origin xxxx.git 经过以上操作,这个仓库就和从github上克隆下来的一模一样
- AC自动机fail树上dfs序建线段树+动态memset清空
题意:http://acm.hdu.edu.cn/showproblem.php?pid=4117 思路:https://blog.csdn.net/u013306830/article/detail ...
- 基于docker的mongodb安装以及PHP使用
说明:用docker基于单服务器,虚拟多个服务器的方案, 以下是两个config服务器,两个分片,以及每个分片有一个副本的方案 这里关于给mongodb设置远程密码的问题,我采取了用两个compser ...