当需要创建子进程数量不多的时候,可以直接利用multiprocessing中的Process动态生成多个进程
但是如果是成百甚至上千个任务,手动地创建它的工作量很大,此时就可以利用到multiprocessing下的pool
初始化Pool时,可以指定一个最大的进程数,当有新的请求提交到Pool中时,
如果池子还没有满,那么就会创建一个新的进程来执行该请求,但如果满了(池子中的进程已经到达最大数量)
那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行。
 
 from multiprocessing import Pool
import os,time,random #定义一个函数
def download(i):
print("(%d)--进程ID为%d的进程开始执行"%(i,os.getpid()))
t_start = time.time() time.sleep(2* random.random())
t_stop = time.time()
print("(%d)--进程ID为%d的进程执行完毕,耗时%f秒"%(i,os.getpid(),t_stop-t_start)) if __name__ == '__main__':
po = Pool(3) #定义一个进程池,最大进程数量
for i in range(10):
#同步(自加阻塞)
po.apply(func=download,args=(i,)) #同步 # 每次循环将会用空闲出来的子进程去调用目标--异步
# po.apply_async(func=download,args=(i,)) #异步 print('-------start---------') po.close() #关闭进程池,关闭后po就不再接受新的请求
po.join() #等待进程池中所有子进程执行完成,阻塞必须放在close之后
print('-------end---------')
-------start---------
(0)--进程ID为6476的进程开始执行
(1)--进程ID为6212的进程开始执行
(2)--进程ID为6284的进程开始执行
(0)--进程ID为6476的进程执行完毕,耗时0.975056秒
(3)--进程ID为6476的进程开始执行
(1)--进程ID为6212的进程执行完毕,耗时1.030059秒
(4)--进程ID为6212的进程开始执行
(2)--进程ID为6284的进程执行完毕,耗时1.735099秒
(5)--进程ID为6284的进程开始执行
(4)--进程ID为6212的进程执行完毕,耗时1.078062秒
(6)--进程ID为6212的进程开始执行
(6)--进程ID为6212的进程执行完毕,耗时0.373021秒
(7)--进程ID为6212的进程开始执行
(3)--进程ID为6476的进程执行完毕,耗时1.759101秒
(8)--进程ID为6476的进程开始执行
(5)--进程ID为6284的进程执行完毕,耗时1.608092秒
(9)--进程ID为6284的进程开始执行
(9)--进程ID为6284的进程执行完毕,耗时0.325019秒
(7)--进程ID为6212的进程执行完毕,耗时1.248071秒
(8)--进程ID为6476的进程执行完毕,耗时1.817104秒
-------end---------
* 刚开始有3个进程,执行完一个之后,后面的新进程添加进来,依次类推。谁先运行完,不一定。
* 这里`po.join()`阻塞程序执行,主进程和子进程都用print。如果没有,会看不到效果。
 
 from multiprocessing import Pool
import os,time,random #定义一个函数
def download(i):
print("(%d)--进程ID为%d的进程开始执行"%(i,os.getpid()))
t_start = time.time() time.sleep(2* random.random())
t_stop = time.time()
print("(%d)--进程ID为%d的进程执行完毕,耗时%f秒"%(i,os.getpid(),t_stop-t_start)) if __name__ == '__main__':
po = Pool(3) #定义一个进程池,最大进程数量
for i in range(10):
#同步(自加阻塞)
# po.apply(func=download,args=(i,)) #同步 # 每次循环将会用空闲出来的子进程去调用目标--异步
po.apply_async(func=download,args=(i,)) #异步 print('-------start---------') po.close() #关闭进程池,关闭后po就不再接受新的请求
po.join() #等待进程池中所有子进程执行完成,阻塞必须放在close之后
print('-------end---------')
#同步时,输出的结果:
(0)--进程ID为5648的进程开始执行
(0)--进程ID为5648的进程执行完毕,耗时0.069004秒
(1)--进程ID为2556的进程开始执行
(1)--进程ID为2556的进程执行完毕,耗时1.278073秒
(2)--进程ID为1864的进程开始执行
(2)--进程ID为1864的进程执行完毕,耗时1.308075秒
(3)--进程ID为5648的进程开始执行
(3)--进程ID为5648的进程执行完毕,耗时1.673096秒
(4)--进程ID为2556的进程开始执行
(4)--进程ID为2556的进程执行完毕,耗时0.887051秒
(5)--进程ID为1864的进程开始执行
(5)--进程ID为1864的进程执行完毕,耗时1.699097秒
(6)--进程ID为5648的进程开始执行
(6)--进程ID为5648的进程执行完毕,耗时1.817104秒
(7)--进程ID为2556的进程开始执行
(7)--进程ID为2556的进程执行完毕,耗时0.595034秒
(8)--进程ID为1864的进程开始执行
(8)--进程ID为1864的进程执行完毕,耗时0.231013秒
(9)--进程ID为5648的进程开始执行
(9)--进程ID为5648的进程执行完毕,耗时1.656095秒
-------start---------
-------end---------

同步和异步的区别:

 

进程池_Pool的更多相关文章

  1. python进程池剖析(三)

    之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...

  2. python进程池剖析(二)

    之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果 ...

  3. python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

  4. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  5. 64位进程池HashCode兼容处理

    背景 net旧项目使用32位生成的HashCode,存储到数据库中.迁移到64位上,就需要对HashCode做兼容处理. 解决方案 1:进程池配置支持32位程序. 2:对Hashcode做兼容处理,[ ...

  6. Linux客户/服务器程序设计范式2——并发服务器(进程池)

    引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...

  7. PYTHON多进程编码结束之进程池POOL

    结束昨晚开始的测试. 最后一个POOL. A,使用POOL的返回结果 #coding: utf-8 import multiprocessing import time def func(msg): ...

  8. python(进程池/线程池)

    进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...

  9. python多进程,以及进程池并发

    模拟多进程 #!/usr/bin/env python#-*- coding:utf-8 -*-import timefrom multiprocessing import Process def s ...

随机推荐

  1. 【Codeforces 20C】 Dijkstra?

    [题目链接] 点击打开链接 [算法] dijkstra [代码] #include<bits/stdc++.h> using namespace std; typedef long lon ...

  2. 【旧文章搬运】Windows句柄表分配算法分析(实验部分)

    原文发表于百度空间,2009-03-31========================================================================== 理论结合实 ...

  3. UI:数据库练习、滤镜效果

    相机处理滤镜效果 滤镜主要使用在相机的美颜. #import "ViewController.h" #import "ImageUtil.h" #import ...

  4. Node.js之网游服务器实践

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 随着Node.js的不断发展与壮大,应用范围也越来越广泛,从传统的企业应用,到互联网使用,再到云计算的发展, ...

  5. 【Codeforces自我陶醉水题篇~】(差17C code....)

    Codeforces17A 题意: 有一种素数会等于两个相邻的素数相加 如果在2~n的范围内有至少k个这样的素数,就YES,否则就NO; 思路: 采用直接打表,后面判断一下就好了.那个预处理素数表还是 ...

  6. Unity3D教程:换装方法

    http://www.manew.com/4136.html 游戏内的角色,能够像纸娃娃换装那样子让玩家可以为自己的角色改变外观,一直是相当受欢迎的功能:一般而言,我们建好的 3D 模型,如果要将其中 ...

  7. Mantis优化改造(技术篇)

    为什么要写这篇? 既然都过去这么久了,都回忆不起来了,为什么还要整理出来这篇文章呢? 这还要追溯到2018年3月份. 当时换工作,面试了国内某知名电视厂商. 简历上面写了我优化改造了bug管理系统ma ...

  8. background-size属性

    background-size:属性有 auto:length :百分比 length 如:10px 20px 固定的 或者是写成一个 ,10px  另外一个就默认为 auto; 写成百分比的形式 是 ...

  9. 水题 Codeforces Round #303 (Div. 2) D. Queue

    题目传送门 /* 比C还水... */ #include <cstdio> #include <algorithm> #include <cstring> #inc ...

  10. 基于node 搭建http2服务

    1.准备工作:安装node2.安装http2: npm install http2 -g安装完成后,在安装目录中appData/Roaming>npm>node_modules>ht ...