2018年8月25日多进程编程总结

今天遇到的新单词: terminal    n终端 terminate  v结束,使终结 basic        adj基本的

python中os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境 清屏的命令是os.system("cls")

多进程编程的总结: 多进程编程需要引入 multiprocessing模块 import multiprocessing

基于函数创建一个进程的语句: def my_proc():     print("我是一个独立的进程:程序的进程编号:", os.getpid(), os.getppid())  p1 = multiprocessing.Process(target=my_proc)

python内建标准模块 multiprocessing 对多进程并发编程提供了良好的支持,通过该模块 的 Process 进程类型,可以很方便的创建和管理多个进程;通过该模块提供的 Lock|RLock 进 程锁类型、Event 事件类型、Condition 条件类型等等也可以很方便的完成进程间同步操作。 和多线程的操作方式类似,多进程的实现方式也提供了面向过程的实现和面向对象的实现 同时多进程的本地数据共享和通信模式也非常的类似多线程编程

multiprocessing 常见属性和方法 名称  描述 Process      进程类型,用于创建和管理进程 Lock|RLock      进程互斥锁|重用锁,用于进程同步 Event          进程事件类型,用于进程同步 Condition     进程条件类型,用于进程同步 Queue         进程队列类型,用于多进程数据共享(不推荐,因为它多用于线程) Manager      进程管理类型,用于多进程数据共享(多进程管理中一般多使用该类型) Listener|Client 进程监听|客户端,基于网络多进程之间的数据共享

基于函数查看进程号(面向过程):os     getpid(): get process id:获取进程编号     getppid(): get parent process id:获取父进程编号

基于类型Process类型中的属性和方法(面向对象):     name:进程名称                     self.name     ident:进程编号                      self.ident     daemon:是否守护进程,默认False    进程名.darmon = True     start():启动进程                    对象名.start()     run(); 进程执行方法     terminate(): 结束进程     is_alive(): 判断进程是否存活       print(对象名.is_alive())       join():独占模式,要求当前进程函数执行完才能继续执行其他的进程 process类型中的属性和方法也可以通过: print(multiprocessing.current_process().name)方式使用

main方法中运行的是主进程,通过 multiprocessing 创建的子进程是由 主进程产生的,所以通过multiprocessing 创建的子进程的ppid号就是主进程的pid号

创建进程时参数的处理: 1.基于函数创建的进程,如果有参数的话直接在定义函数的时候将形参写在函数名后边的括号中, 当调用函数的时候,直接把参数一起写进去,实例: def my_proc2(name):     print(name, "我是一个独立的进程:程序的进程编号:", os.getpid(), os.getppid()) p11 = multiprocessing.Process(target=my_proc2, args=("tom",))

2.基于类型创建的进程,如果有参数的话直接将形参定义在类型的__init__方法中,创建对象的 时候直接将参数写在类名后面的括号中。 p1=Person(参数)

共享数据问题,面向过程中的多进程并发模式:进程池: 多线程的操作模式下我们的全局变量是多个线程共享的,但是在多进程的情况下,进程本身就是一 个独立运行的程序,多进程意味着当前程序被执行了多次,每个进程中全局变量的数据都是互相独立的 在多进程并发处理的情况下如果用设置全局变量或者是传递参数的方式,并不能让数据被多个进程共享 函数执行并发操作时,每个进程都会单独拷贝一份当前进程的变量数据进行独立使用而不互相影响

为了让多个进程并发操作某一个函数,在面向过程中出现了进程池的概念: 多进程的操作在实际应用中也是非常多的,但是纯底层的代码开发控制并发也是一件非常繁 琐的事情,所以就出现了面向过程多进程并发的优化操作方式:进程池 Pool 通过进程池 Pool 可以快速创建多个进程执行指定函数,完成高并发处理操作 (1) Pool 对象的属性和方法 名称             描述 apply(func, args)  传递参数 args 并执行函数 func,同时阻塞当前进程直到该函数执行完成,            函数 func 只会在进程池中的一个进程中运行

apply_async(       传递参数 args 并执行函数 func,该方法不会形成阻塞 func,           函数执行完成之后可以通过结果对象的 get()方法获取结果 args,           如果结果对象可用时会自动调用 callback 指定的函数 callback,       如果结果对象调用失败时会自动调用 error_callback 指定的函数 error_callback )

close()  Pool 进程池的底层工作机制是向进程池提交任务产生工作进程执行      该方法是主动停止给进程池提交任务,并等待所有提交任务执行完成退出

terminate()  立即结束该进程,当进程池对象被回收时自动调用该方法

join()  独占模式,等待工作进程退出,再次执行必须调用 close()或者 teminate

进程池的基本实现: import multiprocessing

def my_process():     print("hello my name is : ", multiprocessing.current_process().name)

if __name__ == "__main__":     # 创建一个进程池对象,该进程池可以产生两个处理进程     pool = multiprocessing.Pool(2)     # 定义 8 个任务,交给进程池处理     for i in range(8):           pool.apply_async(my_process)     # 停止提交任务     pool.close()     # 独占模式:让主线程等待进程池任务执行完成     pool.join()

进程池的简单案例:多进程下载 import multiprocessing, time

def download(url):     print(multiprocessing.current_process().name, "开始下载..")     time.sleep(0.5)     print(multiprocessing.current_process().name,"下载完成<<")     time.sleep(2)     return "下载的数据" def savedata(data):     print(multiprocessing.current_process().name,"下载的数据")

if __name__ == "__main__":     # 创建进程池     p = multiprocessing.Pool(5)     # 任务下载循环     for i in range(20):         p.apply_async(download, args=("http://www.dy2018.com",), callback=savedata)     # 停止提交任务     p.close()     # 独占     p.join()

多进程面向对象实现: 多进程的面向对象的实现方式类似多线程的操作模式 自定义进程类型,继承系统进程标准类型 multiprocessing.Process 重写父类的 run()方法,在方法中定义执行代码 在使用时创建该自定义进程类型的对象,调用对象的 start()方法启动一个新的进程

多进程之间的数据共享: 多进程之间的数据共享,主要由 PYTHON 中提供的内建模块 multiprocessing.Manager 类型实现, 该类型内置了大量的用于数据共享的操作:multiprocessing.Manager 常见属性和方法如下  名称          描述 Array          内置进程间共享数组类型 Queue          内置进程间共享队列类型 list()      内置进程间共享列表类型 dict()      内置进程间共享字典类型 Value          内置进程间共享值类型 Barrier      进程同步类型 BoundedSemaphore| Semaphore  进程信号量类型 Lock|RLock      进程互斥锁/重用锁 Event          进程同步事件类型 Condition      进程同步条件类型

多用multiprocessing.Manager,同时有multiprocessing.Queue(队列类型),multiprocessing.Pipe(管道类型)两种方式,但是不常用, 另外两种方式课堂文档里面有讲解:

在编程的时候,在括号里面的等号两边不需要空格,在括号外边的等号两边需要空格

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python入门之Python引用模块和查找模块路径

#这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力。对于“模...

45390
来自专栏林冠宏的技术文章

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其调度器。

45810
来自专栏青玉伏案

PHP关于web页面交互内容

1. 学php学了有一段时间了总结总结给大家分享一下 2. PHP中的引用 第一段程序: <?php $first_name="fir...

29080
来自专栏Linyb极客之路

工作流引擎之activiti任务监听器

任务监听器只能添加到流程定义中的用户任务中。 注意它必须定义在BPMN 2.0 extensionElements的子元素中, 并使用activiti命名空间,...

34320
来自专栏AILearning

多线程的基础学习

进程:是一个正在执行中的程序, 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:是进程中的一个独立的控制单元, 线程在控制中进...

19170
来自专栏十月梦想

ES6基础语法之模块化

比如我希望在a.js中使用b.js的变量或者函数,那么ES6就中模块化就帮到咱们啦!

61840
来自专栏Python中文社区

每天一个Linux命令:grep

grep 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则...

19750
来自专栏数据结构笔记

Django搭建博客(九):为博客添加代码高亮显示和 md文档支持

特别需要注意的是:代码块必须使用三个 '`' 符号包裹起来才能正确识别,语言标记可有可无,但是三个 '`' 必须单独成行。

30730
来自专栏烂笔头

Python标准库笔记(5) — sched模块

目录[-] 事件调度 sched模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。 class sched.scheduler(timefu...

36950
来自专栏程序员同行者

python3模块: sys

17630

扫码关注云+社区

领取腾讯云代金券