###############   进程池    ##############

"""

进程池的概念
为什么会有进程池?
1,因为每次开启一个进程,都需要创建一个内存空间,这是耗时的
2,进程过多,操作调度也会耗时,
所以会有非常大的性能问题,
所以我们不会让进程太大,我们会设计一个进程池, 进程池:
1,Python中先创建一个进程的池子,
2,这个进程池能存放多少个进程,比如有5个进程,
3,先把这些进程创建好,
4,比如有50个任务他们到进程池里面去找进程,找到的就执行,找不到的就等待,
5,进程执行结束之后,不会结束,而是返回进程池,等待下一个任务,
所以进程池,可以节省进程创建的时间,节省了操作系统的调度,而且进程不会过多的创建, 所以进程池和信号量有什么关系?
假设有200个任务,
信号量,信号量还是200个进程在排队,去拿钥匙,所以不能控制有多少进程,而是控制了同一时间有几个进程在执行,
也就是只允许5个进程让操作系统调度,节省了操作系统的调度时间,但是并没有节省进程的创建时间,
而进程池,是有200个任务去拿进程,所以进程池既是节省了操作系统的调度时间,也节省进程的创建时间, 更高级的进程池是比较智能的,
比如现在进程池有5个进程,就可以处理过来了,就不需要增加
但是如果处理等待的任务太多了,急需要往进程池里面加进程,一直到设置的进程池上限
如果任务减少了,就进程池里面减少,
这是比较智能的, Python中没有高级的进程池,只有一个固定的进程数的进程池,没有弹性的那种, """

进程池的使用:进程池的同步调用:

import os,time
from multiprocessing import Pool def work(n):
print('%s run' %os.getpid())
time.sleep(1)
return n**2 if __name__ == '__main__':
p=Pool(3) #进程池中从无到有创建三个进程,以后一直是这三个进程在执行任务
res_l=[]
for i in range(10):
res=p.apply(work,args=(i,)) # 同步调用,直到本次任务执行完毕拿到res,等待任务work执行的过程中可能有阻塞也可能没有阻塞
# 但不管该任务是否存在阻塞,同步调用都会在原地等着
res_l.append(res) print(res_l) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

进程池的使用:进程池的异步调用:

import os
import time
import random
from multiprocessing import Pool def work(n):
print('%s run' %os.getpid())
time.sleep(random.random())
return n**2 if __name__ == '__main__':
p=Pool(3) #进程池中从无到有创建三个进程,以后一直是这三个进程在执行任务
res_l=[]
for i in range(10):
res=p.apply_async(work,args=(i,)) # 异步运行,根据进程池中有的进程数,每次最多3个子进程在异步执行
# 返回结果之后,将结果放入列表,归还进程,之后再执行新的任务
# 需要注意的是,进程池中的三个进程不会同时开启或者同时结束
# 而是执行完一个就释放一个进程,这个进程就去接收新的任务。
res_l.append(res) # 异步apply_async用法:如果使用异步提交的任务,主进程需要使用jion,等待进程池内任务都处理完,然后可以用get收集结果
# 否则,主进程结束,进程池可能还没来得及执行,也就跟着一起结束了
p.close()
p.join()
for res in res_l:
print(res.get()) #使用get来获取apply_aync的结果,如果是apply,则没有get方法,因为apply是同步执行,立刻获取结果,也根本无需get

###############   进程池的返回值   ##############

# 进程池的返回值,

from multiprocessing import Pool, Process
def func(i):
return i
# if __name__ == '__main__':
# pool = Pool(5)
# res_list = []
# for i in range(10):
# # res = pool.apply(func,args=(i,)) # 所以这个结果接收,就是返回值,
# res = pool.apply_async(func,args=(i,)) # 所以这个结果接收,就是返回值,
# res_list.append(res)
# for res in res_list:
# print(res.get()) # get会阻塞等待结果 # 上面讲了apply和apply_async 的返回值的问题,
# 下面讲讲map的返回值的问题,比较简单 if __name__ == '__main__':
pool = Pool(5)
ret = pool.map(func,range(10))
print(ret) # 这是返回了一个列表, # 使用的时候想用map,map搞不定就使用,apply_async

###############  进程池的回调函数    ##############

# 进程池的回调函数

from multiprocessing import Pool

def func1(n):
print(111)
return n def func2(n):
print(222)
print(n*2) if __name__ == '__main__':
p = Pool(5)
p.apply_async(func1,args=(10,),callback=func2)
p.close()
p.join()
# 回调函数都是在主进程中执行的,

python语法基础-并发编程-进程-进程池以及回调函数的更多相关文章

  1. python语法基础-并发编程-进程-进程理论和进程的开启

    ############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生 ...

  2. python语法基础-并发编程-进程-进程锁和进程间通信

    ###############   守护进程  ############## """ 守护进程 父进程中将一个子进程设置为守护进程,那么这个子进程会随着主进程的结束而结束 ...

  3. python语法基础-并发编程-进程-其他

    ###############    多进程的信号量    ############## # 多进程的信号量 from multiprocessing import Process import ti ...

  4. python语法基础-并发编程-线程-长期维护

    ###############   线程和GIL,全局解释器锁    ############## """ 线程 为什么会有进程? 主要是能够同时处理多个任务,多个任务还 ...

  5. python语法基础-并发编程-线程-线程理论和线程的启动

    #######################       线程介绍         ############################## """ 线程介绍 为什 ...

  6. python语法基础-并发编程-协程-长期维护

    ###############    协程    ############## # 协程 # 小知识点, # 协程和进程和线程一样都是实现并发的手段, # 开启一个线程,创建一个线程,还是需要开销, ...

  7. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  8. python语法基础-网络编程-TCP协议和UDP协议

    ###############    网络编程    ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...

  9. python语法基础-网络编程-HTTP协议

    ###############    HTTP协议    ############## """ 当你在浏览器地址栏敲入“http://www.cnblogs.com/”, ...

随机推荐

  1. 简单javascript学习总结

    2019-10-19 //文章汇总于绿叶学习网 console.log()                              //控制台输出 目录 数据类型:.... 2 函数:.... 3 ...

  2. HDU - 2819 Swap(二分匹配)

    题意:交换任意两行或两列,使主对角线全为1. 分析: 1.主对角线都为1,可知最终,第一行与第一列匹配,第二行与第二列匹配,……. 2.根据初始给定的矩阵,若Aij = 1,则说明第i行与第j列匹配, ...

  3. Day2-T2

    原题目 Describe:贪心,保证至少一条路牛的数量最多 code: #include<bits/stdc++.h> using namespace std; long long n,m ...

  4. Intent 显示意图 隐式意图

    //显式意图  :必须指定要激活的组件的完整包名和类名 (应用程序之间耦合在一起) // 一般激活自己应用的组件的时候 采用显示意图  //隐式意图: 只需要指定要动作和数据就可以 ( 好处应用程序之 ...

  5. Pytorch_torch.nn.MSELoss

    Pytorch_torch.nn.MSELoss 均方损失函数作用主要是求预测实例与真实实例之间的loss loss(xi,yi)=(xi−yi)2 函数需要输入两个tensor,类型统一设置为flo ...

  6. IDEA的一些常用设置

    一.给方法之间添加分割线 效果: 二.自动导包 三.字体以及大小和行间距 四.注释的字体颜色 五.项目编码 六.省点模式(开启省点模式后会取消代码检查和提示等,需要注意) 七.代码垂直或者水平分区显示 ...

  7. Hour of Code|京东云邀您一起,“码”上行动

    "如果我并不希望成为一名程序员,那么为什么需要学习编程呢?" 相信很多人对于现在鼓励从小就学习编程的趋势都在心里问过这样的一个问题.在回答这个问题前,先和大家分享一个小故事吧. 1 ...

  8. RGB转到HSV色彩空间转换

    原文链接:https://blog.csdn.net/lsg19920625/article/details/78416649

  9. faster rcnn报错:TypeError: slice indices must be integers or None or have an __index__ method

    https://blog.csdn.net/qq_27637315/article/details/78849756 https://blog.csdn.net/qq_21089969/article ...

  10. 和为S的连续正序列

    [问题]小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...