python之multiprocessing模块的Process

发布时间 2023-08-20 16:17:14作者: 相见似若梦

python之进程

概述:

python进程是程序中执行的程序,每个进程都有自己的地址空间。

进程:资源分配的最小单位。线程:程序执行的最小单位。协程:协程完全由程序所控制

在电脑程序中一般进程>线程>协程,进程中可以包含多个线程,线程中可以包含多个协程。

在执行多进程或多线程的时候,当cpu有多个核心的时候,那么进程间或线程间就是并行的。当cpu只有一个核心的时候,那么那么进程间或线程间就是并发的。

并发和并行

并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间
再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状。这种方式我们称之为并发

并行:当系统有一个以上CPU时,则线程操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占

Multiprocess.Process模块

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

def task():
    print("task")
if __name__=="__main__":
    p = Process(target=task)		#注意不要调用成task()函数
    p.start()

Process的参数和方法

参数

group:表示线程组,默认为None

target:表示调用对象,子程序要执行的任务

args:表示调用位置的参数(要用元组)

kwargs:表示调用对象的字典

name:子进程多的名称

方法

start():启动子进程,调用默认的run()

run():表示进程的运行方式。

name:进程的名字

terminate:强制子程序终止进程

is_alive():判断子程序是否还存货

daemon:表示守护进程,默认值是False,当设置为Ture时,当父进程结束时,它会尝试终止其所有守护进程子。必须在start()之前设置。

join([timeout]):timeout默认值时None,该方法为阻塞,在调用join的子进程结束后才开始后面的代码,如果timeout有设定值,join会阻塞设定的时间才开始后面的代码

pid:返回进程的ID。用os模块的os.getppid()是返回主进程的ID,os.getpid()是返回当前进程的ID。

exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)

示例:

import os
from multiprocessing import Process
import time

def task(args):
    print('子进程开始%s,子进程的id:%s和父id:%s'% (time.time(),os.getpid(),os.getppid()))
    time.sleep(args)
    print('子进程结束%s'%time.time())

if __name__=="__main__":
    p = Process(target=task,name="task",args=(1,))
    p.start()
    p.join()
    print("子进程结束",p.is_alive())
    print('主进程结束')

结果:

子进程开始1692500910.6039252,子进程的id:348和父id:12076
子进程结束1692500911.6121373			#sleep睡了三秒
子进程结束 False						#因为join,所以在子进程结束后才执行
主进程结束

自定义进程

自定义进程可以设定一个类继承父类Process,如果有默认属性要求,自己写的__init__(self)会将父类的__init__覆盖,为了不丢失父类的一些属性,需要用super()加载

注意:在自定义进程中,必须要有run()函数。

示例:

import os
import time
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self, value):
        super(MyProcess, self).__init__()
        self.value = value

    def run(self):		#run()是Process类专门留出来让你重写的接口函数
        self.task1()
        self.task2()

    def task1(self):
        print("task1" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))

    def task2(self):
        print("task2" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))


if __name__ == "__main__":
    p = MyProcess(2)
    p.start()
    p.join()
    print('主进程结束')