38. Python 多进程Manager 进程池

简介:

强大的Manager模块

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

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

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

以下例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import  multiprocessing
def  worker(d,l):
     + =  range ( 11 16 )
     for  in  xrange ( 1 6 ):
         key  =  "key{0}" . format (i)
         val  =  "val{0}" . format (i)
         d[key]  =  val
 
if  __name__  = =  "__main__" :
     manager  =  multiprocessing.Manager()
     =  manager. dict ()
     =  manager. list ()
     =  multiprocessing.Process(target = worker, args = (d, l))
     p.start()
     p.join()
     print (d)
     print (l)

打印结果:

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



进程池:

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

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

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

阻塞和非阻塞的区别

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

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

举例:

非阻塞:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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  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" )

打印结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#######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



阻塞:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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  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" )

打印结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#######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


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



本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2049893

相关文章
|
4月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
9月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
462 0
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
662 1
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
178 0
|
8月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
8月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
641 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
477 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。

热门文章

最新文章

推荐镜像

更多