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(管道类型)两种方式,但是不常用,
另外两种方式课堂文档里面有讲解:

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

猜你喜欢

转载自blog.csdn.net/qq_40994972/article/details/82052767