热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:38.Python多进程Manager进程池

篇首语:本文由编程笔记#小编为大家整理,主要介绍了38.Python多进程Manager进程池相关的知识,希望对你有一定的参考价值。强大的Man

篇首语:本文由编程笔记#小编为大家整理,主要介绍了38. Python 多进程Manager 进程池相关的知识,希望对你有一定的参考价值。


强大的Manager模块

上一节实现的数据共享的方式只有两种结构Value和Array。

Python中提供了强大的Manager模块,专门用来做数据共享。

他支持的类型非常多,包括:Value、Araay、list、dict、Queue、Lock等。

以下例子:

import multiprocessing
def worker(d,l):
    l += range(11, 16)
    for i in xrange(1, 6):
        key = "key{0}".format(i)
        val = "val{0}".format(i)
        d[key] = val
if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()
    l = manager.list()
    p = multiprocessing.Process(target=worker, args=(d, l))
    p.start()
    p.join()
    print(d)
    print(l)

打印结果:

{'key3': 'val3', 'key2': 'val2', 'key1': 'val1', 'key5': 'val5', 'key4': 'val4'}
[11, 12, 13, 14, 15]



进程池:

Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,

如果池还没有满,那么就会创建一个新的进程用来执行该请求;

但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程。

阻塞和非阻塞的区别

Pool.apply_async     非阻塞,定义的进程池进程最大数可以同时执行。

Pool.apply            一个进程结束,释放回进程池,下一个进程才可以开始

举例:

非阻塞:

import multiprocessing
import time
def worker(msg):
    print ("#######start {0}########".format(msg))
    time.sleep(1)
    print ("#######end   {0}########".format(msg))
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=3)
    for i in xrange(1, 10):
        msg = "hello{0}".format(i)
        pool.apply_async(func=worker, args=(msg,))
    pool.close()
    pool.join()     #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    print ("main end")

打印结果:

#######start hello1########
#######start hello2########
#######start hello3########
#######end   hello1########
#######start hello4########
#######end   hello2########
#######start hello5########
#######end   hello3########
#######start hello6########
#######end   hello4########
#######start hello7########
#######end   hello5########
#######start hello8########
#######end   hello6########
#######start hello9########
#######end   hello7########
#######end   hello8########
#######end   hello9########
main end



阻塞:

import multiprocessing
import time
def worker(msg):
    print ("#######start {0}########".format(msg))
    time.sleep(1)
    print ("#######end   {0}########".format(msg))
    
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=3)
    for i in xrange(1, 10):
        msg = "hello{0}".format(i)
        pool.apply(func=worker, args=(msg,))
    pool.close()
    pool.join()     #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    print ("main end")

打印结果:

#######start hello1########
#######end   hello1########
#######start hello2########
#######end   hello2########
#######start hello3########
#######end   hello3########
#######start hello4########
#######end   hello4########
#######start hello5########
#######end   hello5########
#######start hello6########
#######end   hello6########
#######start hello7########
#######end   hello7########
#######start hello8########
#######end   hello8########
#######start hello9########
#######end   hello9########
main end


对比一下两种类型的输出状态即可明白。


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
author-avatar
mobiledu2502887867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有