#原创,转载请联系

假设我们写的一个程序需要运行100个子进程的时候,那么写程序时,不可能循环创建销毁100个进程吧?进程的创建与销毁是很耗系统的资源的。

进程池的作用就体现出来了。

进程池可以控制进程的数量,重复利用进程对象,减少创建和销毁进程的开销。

-----------------------------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------------------------------------

1.创建进程池

pool = multiprocessing.Pool()

创建进程池可以接收一个参数,这个参数可以设置进程池的最大值。就是指定有几个子进程在“同时”进行。(为什么说是“同时”,因为在并发的情况下,子进程和主进程是按照时间片轮寻的方式执行的,只是切换得过快,并不是真的一起运行。)

-----------------------------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------------------------------------

2.进程池的应用

import multiprocessing
import os
import random
import time def run_time(index):
start_time = time.time()
time.sleep(random.random())
print("任务%d 任务id为%d 任务运行的时间为%0.2f" % (index,os.getpid(),
time.time()-start_time)) if __name__ == '__main__':
pool = multiprocessing.Pool(3)
for i in range(10):
pool.apply_async(func=run_time,args=(i,))
pool.close()
pool.join()
print("结束标志") 输出:
任务2  任务id为3191  任务运行的时间为0.29
任务1  任务id为3190  任务运行的时间为0.33
任务0  任务id为3189  任务运行的时间为0.45
任务3  任务id为3191  任务运行的时间为0.41
任务4  任务id为3190  任务运行的时间为0.39
任务5  任务id为3189  任务运行的时间为0.76
任务7  任务id为3190  任务运行的时间为0.52
任务6  任务id为3191  任务运行的时间为0.80
任务8  任务id为3189  任务运行的时间为0.56
任务9  任务id为3190  任务运行的时间为0.80
结束标志

-----------------------------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------------------------------------

3.进程池的进程默认都是守护进程

进程池的子进程都是由主进程创建的,且默认都是守护进程。所以当主进程执行完之后,进程池的子进程全部都被中断。如果需要执行完进程池的子进程,才结束程序,需要加上两句代码。

pool.close()  # 必须先关闭进程池,不再让它接收新的进程,才能进行下一步的阻塞。(已经在排队的进程不算新进程了!例如上面的例子,
10个子进程已经在进程池排队,所以join方法会阻塞直到10个子进程执行完成。)
pool.join()

上面的例子,如果没有这两句代码,输出会变成下面的结果

import multiprocessing
import os
import random
import time def run_time(index):
start_time = time.time()
time.sleep(random.random())
print("任务%d 任务id为%d 任务运行的时间为%0.2f" % (index,os.getpid(),
time.time()-start_time)) if __name__ == '__main__':
pool = multiprocessing.Pool(3)
for i in range(10):
pool.apply_async(func=run_time,args=(i,))
print("结束标志") 输出:
结束标志

进程池排队的10个进程,都是守护进程。还没来得及运行,主进程运行了,然后中断了进程池所有的子进程,因次子进程并没有输出。

-----------------------------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------------------------------------

4.进程池中子进程之间的通信。

关于进程间的通信,可以看我的另一篇博客。https://www.cnblogs.com/chichung/p/9533227.html

那么,进程池中的子进程之间怎么进行通信呢?

我们来在进程池创建两个子进程,然后让一个子进程把数据放在队列,另外一个子进程在队列里取数据。

import multiprocessing
import time def send_data(queue):
for i in "python":
queue.put(i)
print("把%s放进队列里" % i) def recv_data(queue):
while not queue.empty():
data = queue.get()
print("在队列里取得%s" % data) if __name__ == '__main__':
q = multiprocessing.Manager().Queue(5) # 进程池之间的通信中间要加Manager(),单纯进程间的通信并不用,这是最大的区别。
pool = multiprocessing.Pool(2)
pool.apply_async(func=send_data,args=(q,))
time.sleep(1)
pool.apply_async(func=recv_data,args=(q,))
time.sleep(1)
pool.close()
pool.join()
print("结束标志") 输出:
把p放进队列里
把y放进队列里
把t放进队列里
把h放进队列里
把o放进队列里
在队列里取得p
把n放进队列里
在队列里取得y
在队列里取得t
在队列里取得h
在队列里取得o
在队列里取得n
结束标志

进程池里面子进程的通信也是用到Queue队列,但是创建的方式稍微有点不同,上面代码注释那里已经提出。

python中进程池的应用的更多相关文章

  1. python中进程池和回调函数

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  2. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  3. Python多进程库multiprocessing中进程池Pool类的使用

    问题起因 最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似ba ...

  4. Python中进程

    程序 程序:编写完的代码称为程序. 进程 进程:又称重量级进程,正在执行中的程序称为进程.进程的执行会占用内存等资源.多个进程同时执行时,每个进程的执行都需要由操作系统按一定的算法(RR调度.优先数调 ...

  5. day 27 Python中进程的操作

    进程的创建和结束: multiprocess模块: multiprocess不是一个模块而是python中一个操作.管理进程的包 分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享 ...

  6. python 36 进程池、线程池

    目录 1. 死锁与递归锁 2. 信号量Semaphor 3. GIL全局解释器锁:(Cpython) 4. IO.计算密集型对比 4.1 计算密集型: 4.2 IO密集型 5. GIL与Lock锁的区 ...

  7. python中进程、线程、协程简述

    进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...

  8. python中进程详解

    1:pdb调试:基于命令行的调试工具,非常类似gnu和gdb调试,以下是常用的调试命令: 可以python -m pdb xxx.py(你的py文件名)进入命令行调试模式 命令 简写命令 作用 bea ...

  9. Python 多进程进程池Queue进程通信

    from multiprocessing import Pool,Manager import time def hanshu(queue,a): n = 1 while n<50: # pri ...

随机推荐

  1. Java开发环境配置时的dt.jar与tools.jar是什么(转载)

    你了解dt.jar吗 很多人在初学Java的时候,都要配置环境变量.在配置CLASSPATH的时候,都会加上一个当前目录.,还有两个jar:dt.jar和tools.jar.其实好多人都不了解这两个j ...

  2. Performanced C++ 经验规则

    http://www.cnblogs.com/ccdev/archive/2012/12/27/2836448.html Performanced C++,意为“高性能C++“编程,是笔者和所在团队多 ...

  3. 解析LINQ To Object

    1.解剖Linq to object   此文转载自http://www.cnblogs.com/irenebbkiss/p/4155480.html LINQ想必大家都不陌生了,它 的出现使得我们的 ...

  4. URL大小写敏感之谜

    URL其实就是我们浏览器地址栏的地址,一般由三部分组成: 协议名称,一般就是http 域名,也就是主机名 资源路径 如链接:http://www.w3school.com.cn/js/js_obj_r ...

  5. something about Parameter Estimation (参数估计)

    点估计 Point Estimation 最大似然估计(Maximum Likelihood Estimate —— MLE):视θ为固定的参数,假设存在一个最佳的参数(或参数的真实值是存在的),目的 ...

  6. 洛谷 P1268 树的重量 解题报告

    P1268 树的重量 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题 ...

  7. CF763B Timofey and Rectangles

    题目戳这里. 首先答案肯定是YES,因为一个平面图肯定可以被4种颜色染色,关键是怎么输出方案. 由于4是一个特殊的数字\(4 = 2^2\),而我们还有一个条件就是边长为奇数,而奇数是会改变二进制位的 ...

  8. makefile使用笔记(一)入门

    By francis_hao    Mar 2,2017 makefile makefile一个很简单的例子如下,该实例完成在执行make时,将main.c编译成可执行文件main的功能. 各项的含义 ...

  9. yum命令Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY

    yum命令Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 博客分类: linux   三种解决方案 我采取第三种方案解决的 第一种: linu ...

  10. Codeforces Round #534 (Div. 2) D. Game with modulo(取余性质+二分)

    D. Game with modulo 题目链接:https://codeforces.com/contest/1104/problem/D 题意: 这题是一个交互题,首先一开始会有一个数a,你最终的 ...