

在上次的文章Python基础篇 - 进程与线程、并发与并行中,我们认识了进程与线程的基本概念。今天的Python基础篇知识将介绍多进程的创建。

一.基于multiprocessing模块创建多进程
multiprocessing模块是Python跨平台创建进程的最基础方法,通过实例化Process类,指定要执行的任务(函数/方法),调用start()方法即可启动进程,用法和后续的多线程Thread类高度相似。
# 演示Demo:演示文件的写、读两个进程的执行,实现边写边读import timeimport multiprocessing# 1.向文件中写入数据def write_file():with open("test.txt", "a") as f:n = 1while True:f.write(f"{n}\n")f.flush()n += 1time.sleep(0.5)# 2.从文件中读取数据def read_file():with open("test.txt", "r") as f:while True:time.sleep(0.1)print(f.read(1))if __name__ == "__main__":# 创建一个进程用于写文件p1 = multiprocessing.Process(target=write_file)# 创建一个进程用于读文件p2 = multiprocessing.Process(target=read_file)# 启动进程p1.start()# 启动进程p2.start()
基于multiprocessing模块,我们创建了两个进程,实现了文件的边写边读,如果不创建两个进程的话,该程序将永远不会执行读取数据的函数,而是一直陷入在写入数据的while无限循环中。
注意: 不写if__name__==“__main__”,Windows系统中,创建子进程时会重新导入当前模块,不写会导致无限创建进程,报错崩溃
二.基于自定义Process子类创建多进程
当然,我们还可以通过继承Process父类,实现一个子类,从而达到创建进程的目的。
# 演示Demo:自定义Process子类创建多进程from multiprocessing import Processimport osimport time# 自定义Process子类class MyProcess(Process):def __init__(self, name):super().__init__()self.name = name # 自定义参数,用于区分进程# 重写run()方法,定义进程要执行的任务(方法)def run(self):# 演示下进程执行的逻辑,比如展示下pid,不同进程的idprint(f"自定义子类进程{self.name}启动,进程ID:{os.getpid()},父进程ID:{os.getppid()}")# 模拟任务执行time.sleep(0.2)print(f"自定义子类进程{self.name}执行完毕")if __name__ == "__main__":# 实例化自定义子类,创建子进程p1 = MyProcess(name="子类进程1")p2 = MyProcess(name="子类进程2")# 启动两个进程(调用start(),自动执行run()方法)# 启动进程p1.start()# 启动进程p2.start()

总结:今日我们学习了Python基础篇-多进程-进程的创建。重点掌握基于multiprocessing模块的两种方式。一是直接实例化Process类,指定目标任务和参数,调用start()启动进程、join()等待结束,灵活简单,适合少量进程。二是自定义Process子类,继承该类并分别重写__init__(初始化参数,需调用父类初始化)和run()(定义任务方法),可灵活扩展进程功能。在Python基础篇,后续我们将持续学习Python基础知识,介绍各种算法,祝每一位study er学习愉快。

