#进程池Pool:apply  apply_async-close-join-get  map  callback

#1、进程池Pool:执行下面代码发现任务012先执行,345后执行,因为进程池只有3个进程,6480进程先处理1,接着处理3和5。
# 可以设置线程的数量去轮流执行它的任务:例如下面例子设置3个进程去轮流执行6个任务。
#map 创建和开启子进程:
from multiprocessing import Pool
import time
import os
import random
def func(i): #i接收0-5
print(i,os.getpid())
time.sleep(random.randint(1,3)) if __name__ == '__main__':
p = Pool(3) #开启3个进程来处理6个任务。3个3个的并发:一个进程在同一时间只能执行一个任务。
p.map(func,range(6)) #6个任务。把0-5导入到func去执行。
# 0 16156
# 1 6480
# 2 15412
# 3 6480
# 4 15412
# 5 6480 #2、
#2.1进程池出现的原因:1、开启过多进程会浪费时间,譬如下面的例子,我们只需要开启三个进程来处理六个任务,而不需要开启六个进程。
#            2、操作系统调度过多进程会影响效率。
#2.2开启进程池:池子里有几个进程,有任务来了,就用这个池子里的进程去处理任务,任务处理完之后,
# 再把进程放回池子里,池子里的进程就可以去处理别的任务了。当所有的任务处理完之后,
# 进程池关闭,回收所有的进程。
#2.3开启进程的数量最好是cpu的数量加1。 #3、apply相当于target,是同步调用,代码是按顺序执行的,没有并发的效果,一般不用,
# 因为是同步的话,一个进程就可以了,没必要利用主进程开启子进程的方式来实现同步。
from multiprocessing import Pool
import time
def func(i):
time.sleep(1)
i += 1
print(i) if __name__ == '__main__':
p = Pool(3)
for i in range(6):
p.apply(func,args=(i,))
#
#
#
#
#
# #4、apply_async是异步调用,创建和开启子进程:
# p.close()和p.join()上面的主进程代码执行之后,主进程就结束了。但是进程池的进程还没结束,
# 会让内存产生一大堆没有被回收的进程。所以必须写上这两句代码。使用get拿到结果。
from multiprocessing import Pool
import time
def func(i):
time.sleep(1)
i += 1
return i if __name__ == '__main__':
p = Pool(3)
ret_l = []
for i in range(6):
ret = p.apply_async(func,args=(i,)) #子进程返回结果i给func,结果i = ret.get()
ret_l.append(ret)
p.close() #进程池关闭,不能再往进程池添加新的任务。
p.join() #阻塞等待,主进程等待子进程结束之后才结束。
[print(ret.get()) for ret in ret_l] #异步调用;把子进程返回的结果都放在列表里面,最后才一次性拿取,实现并发。 # #下面代码没有并发效果:
# if __name__ == '__main__':
# p = Pool(3)
# for i in range(6):
# ret = p.apply_async(func,args=(i,))
# print(ret.get()) #子进程每返回一个结果之后才能拿到一个结果,相当于同步,没有并发的效果。
# p.close()
# p.join() #5、map可接收返回值:
from multiprocessing import Pool
def func(i):
i += 1
return i
if __name__ == '__main__':
p = Pool(3)
ret = p.map(func,range(6))#map的最后一个参数是可迭代的,例如range(6)
print(ret)
# [1, 2, 3, 4, 5, 6] # 6、回调函数:把func的返回值传给call做进一步处理。从pid可以看出,call函数是在主进程当中执行:
from multiprocessing import Pool
import os
def func(i):
print('子进程func%s %s'%(i,os.getpid()))
i += 1
return i def call(arg):
print('call %s' % os.getpid())
arg += 1
print(arg) if __name__ == '__main__':
print('主进程%s' % os.getpid())
p = Pool(3)
for i in range(6):
p.apply_async(func,args=(i,),callback=call)
p.close()
p.join()
#
#
#
#
#
#

day42-进程池的更多相关文章

  1. python进程池:multiprocessing.pool

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

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

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

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

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

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

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

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

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

  6. python进程池剖析(三)

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

  7. python进程池剖析(二)

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

  8. python进程池剖析(一)

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

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

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

  10. 使用进程池规避Python的GIL限制

    操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 Python的GIL会对CPU密集型的程序产生影响,如果完全使用Python来编程,怎么避开GIL的限制呢? ...

随机推荐

  1. python3 sort list

    1. 对元素指定的某一部分进行排序,关键字排序 s = ['release.10.txt','release.1.txt','release.2.txt','release.14.txt','rele ...

  2. tensorflow中的神经网络笔记

    1.NN----神经网络 2.CNN卷积神经网络 CNN网络一共有5个层级结构: 输入层 卷积层 激活层 池化层 全连接FC层 一.输入层 与传统神经网络/机器学习一样,模型需要输入的进行预处理操作, ...

  3. tensorflow笔记2(北大网课实战)

    1.正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标,利用给w加权值,弱化了训练数据的噪声 一般不会正则化b. 2.matplotlib.pyplot 3.搭建模块化的神经网络八股: 前向传播就 ...

  4. Cracking Digital VLSI Verification Interview 第三章

    目录 Programming Basics Basic Programming Concepts Object Oriented Programming Concepts UNIX/Linux Pro ...

  5. zTree & ckeditor &ValidateCode.jar 使用个人心得总结

    zTree:依靠 jQuery 实现的多功能 “树插件”. 使用时只需要将下载的压缩包接用,复制里边的css 和 js 到指定目录即可. 如图所示: 在zTree的官网可以找到各种类型树的示例: 地址 ...

  6. Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: 栏位索引超过许可范围:2,栏位数:1

    执行mybaits sql <delete id="delete4BatchesByLineCi" parameterType="java.util.List&qu ...

  7. JavaScript—面向对象贪吃蛇_1

    前面说了.面向对象的思考方式和面向过程的思考方式有着本质的区别. 贪吃蛇.作为各大培训机构.面向对象的练手项目,的确好.我昨天看完视频,有一种领悟面向对象的感觉,当然可能只针对贪吃蛇..要想在实际开发 ...

  8. Ribbon使用及其客户端负载均衡实现原理分析

    1.ribbon负载均衡测试 (1)consumer工程添加依赖 <dependency> <groupId>org.springframework.cloud</gro ...

  9. 创建DateFrame的常用四种方式

    import pandas as pd %pylab 一.使用numpy创建 df = pd.DataFrame(np.arange(16).reshape((4,4)), index=list('a ...

  10. 第 10 章 gdb

    一.参考网址 1.linux c编程一站式学习 二.命令列表 1.图1: 2.图2: 3.图3: 三.重点摘抄 1.断点与观测点的区别 我们知道断点是当程序执行到某一代码行时中断,而观察点是当程序访问 ...