多进程编程

Posted chenliang0309

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程编程相关的知识,希望对你有一定的参考价值。

1 多进程概述

进程是正在执行中的应用程序,一个进程包含了该应用程序的所有信息,如加载数据内存空
间、代码、程序数据、对象句柄,执行单元等等,一个应用程序根据其功能的多样性,可以
通过多个进程并发的形式来实现。
计算机中多线程的操作已经可以实现多任务的处理机制了,但是如果涉及到多核 CPU 或者
多个 CPU 的硬件主机,多进程并发编程的实现能比多线程并发机制更加有效的利用和发挥
硬件资源优势。

2 python多进程开发

2.1 multiprocessing

multiprocess常见属性和方法
名称 描述
Process 进程类型,用于创建和管理进程
Lock RLock
Event 进程事件类型,用于进程同步
Condition 进程条件类型,用于进程同步
Queue 进程队列类型,用于多进程数据共享
Manager 进程管理类型,用于多进程数据共享
Listener Client

2.2 多进程的基础操作

import multiprocessing, time, os


def hello_process():
    # 打印信息,展示当前进程编号,父进程编号
    print("hello my name is process", os.getpid(),os.getppid())


if __name__ == "__main__":
    # 创建一个进程
    proc = multiprocessing.Process(target=hello_process)
    proc.start()
    print("hello, i am main:", os.getpid(), os.getppid())

运行程序,查看运行结果
hello ,i am :2456 2772
hello my name is process 13536 2456

多进程面向对象实现

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

import multiprocessing, os


class MyProcess(multiprocessing.Process):

    ‘‘‘自定义一个进程类型‘‘‘
    def run(self):
        ‘‘‘重写进程处理方法‘‘‘
        print("hello, my name is process:", os.getpid(), os.getppid())


if __name__ == "__main__":
    print("hello, my name is main:", os.getpid(), os.getppid())

    # 创建并启动一个进程
    my_proc = MyProcess()
    my_proc.start()

2,4 带参数的多进程:共享?独占?

多线程的操作模式下我们的全局变量是多个线程共享的,所以多线程并发模式下对于数据的
修改非常危险,那么多进程模式下数据的处理应该是什么样的呢?
通过两种方式来观察多进程模式下数据的处理

  • 全局变量的数据
  • 参数数据

    1 全局变量:多进程数据处理
import multiprocessing, time

# 定义全局变量
msg = 3


def chg_numers():
    ‘‘‘定义处理函数,修改全局变量的值‘‘‘
    global msg

    while msg > 0:
        msg -= 1
        print(multiprocessing.current_process().name, " changed : ", msg)


if __name__ == "__main__":
    # 创建两个进程,同时修改数据
    for i in range(2):
        p = multiprocessing.Process(target=chg_numers)
        p.start()

    time.sleep(2)
    print(multiprocessing.current_process().name, msg)

进程本身就是一个独立运行的程序,多进程意味着当前程序被执行了多次,每个进程中全局变量的数据都是互相独立的。

2 参数传递:多进程数据处理
import multiprocessing, time


def chg_numers(msg):
    ‘‘‘定义处理函数,修改全局变量的值‘‘‘

    while msg > 0:
        msg -= 1
        print(multiprocessing.current_process().name, " changed : ", msg)


if __name__ == "__main__":
    # 创建两个进程,同时修改数据
    msg = 3
    for i in range(2):
        p = multiprocessing.Process(target=chg_numers, args=(msg,))
        p.start()

    time.sleep(2)
    print(multiprocessing.current_process().name, msg)

给多进程并发处理函数传递参数的方式,并不能让数据可以被多个进程共享
函数执行并发操作时,每个进程都会单独拷贝一份当前进程的变量数据进行独立使用而不互
相影响,这也是出现上述代码结果的原因

2.5 多进程的简化:内置进程池

多进程的操作在实际应用中也是非常多的,但是纯底层的代码开发控制并发也是一件非常繁
琐的事情,所以就出现了面向过程多进程并发的优化操作方式:进程池 Pool
通过进程池 Pool 可以快速创建多个进程执行指定函数,完成高并发处理操作

1. Pool对象的属性和方法
名称 描述
apply(func, args) 传递参数 args 并执行函数 func,同时阻塞当前进程直到该函数执行完成,函数 func 只会在进程池中的一个进程中运行
close() Pool 进程池的底层工作机制是向进程池提交任务产生工作进程执行,该方法是主动停止给进程池提交任务,并等待所有提交任务执行完成退出
terminate() 立即结束该进程,当进程池对象被回收时自动调用该方法
join() 等待工作进程退出,再次之间必须调用 close()或者 teminate
















以上是关于多进程编程的主要内容,如果未能解决你的问题,请参考以下文章

python中的多线程和多进程编程

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

代码片段:Shell脚本实现重复执行和多进程

什么是Java多线程编程?

线程学习知识点总结

什么是多线程,多进程?