上篇:Python 多任务编程入门(一)—— 进程基础与创建

张开发
2026/5/20 16:00:22 15 分钟阅读
上篇:Python 多任务编程入门(一)—— 进程基础与创建
目录前言一、为什么要用多任务二、进程是什么三、Python 中创建进程的三大步骤四、主进程与子进程的关系1. 主进程默认会等待子进程结束2. 强制等待子进程join() 方法3. 获取进程编号os.getpid() 与 os.getppid()4. 保护主进程入口if __name__ __main__上篇小结前言在日常开发中我们经常会遇到这样的场景程序需要同时处理多个任务——一边下载文件一边解析数据一边更新界面。如果按顺序一个个执行不仅效率低下还会让用户等待很久。这时候多任务编程就成了提升程序性能和用户体验的关键技术。Python 作为一门易学但功能强大的语言提供了多种多任务实现方式进程、线程、协程。其中进程是操作系统资源分配的最小单位拥有独立的内存空间特别适合 CPU 密集型任务也是理解多任务编程的绝佳起点。本篇博客将分为上下两篇上篇介绍多任务的基本概念、进程与程序的区别、如何创建和管理子进程以及主进程与子进程的关系。下篇深入讲解进程锁解决资源竞争问题、进程池高效管理大量子进程以及多进程编程中容易踩的坑。一、为什么要用多任务想象一下你在用 Python 爬取 1000 个网页如果一个个顺序执行每个请求等 1 秒总耗时将近 17 分钟。而如果让 10 个爬虫“同时”工作时间就能缩短到 1/10。这就是多任务带来的效率提升。多任务是指在同一段时间内程序同时执行多个任务。在 Python 中实现多任务主要有三种方式进程、线程、协程。其中进程是最基础、也是最“独立”的一种方式。二、进程是什么进程就是一个正在运行的程序。当你双击一个应用或者运行python script.py时操作系统就会创建一个进程。每个进程都有自己独立的内存空间、文件句柄等资源它们就像一个个独立的“小世界”互相不干扰。程序vs进程程序是硬盘上的静态文件如.py文件进程是程序被加载到内存并执行后的动态实体。主进程程序启动时默认创建的进程是整个程序的“根”。子进程由主进程或其他子进程通过代码创建的新进程用于执行特定的子任务。三、Python 中创建进程的三大步骤Python 内置的multiprocessing模块让我们能轻松创建和管理进程。步骤 1导入模块import multiprocessing步骤 2创建进程对象p multiprocessing.Process(target函数名, args(参数元组,))target指定子进程要执行的函数名不要加括号。args传给函数的参数必须是元组如(1, hello)单个参数也要写成(1,)。kwargs字典形式的关键字参数如{name:张三}。步骤 3启动进程p.start()基础示例import multiprocessing import time def work(name, seconds): for i in range(3): print(f{name} 正在工作第 {i1} 次) time.sleep(seconds) if __name__ __main__: p1 multiprocessing.Process(targetwork, args(进程A, 1)) p2 multiprocessing.Process(targetwork, kwargs{name: 进程B, seconds: 0.5}) p1.start() p2.start()运行后会看到两个进程交替输出这就是多任务的效果。四、主进程与子进程的关系1. 主进程默认会等待子进程结束如果你在主进程中只写了start()没有额外设置主进程会等所有子进程执行完再退出。2. 强制等待子进程join()方法join()会让当前进程通常是主进程停下来直到被调用的子进程执行完毕。p1.start() p1.join() # 主进程阻塞直到 p1 结束 print(p1 结束了主进程继续)如果需要多个子进程按顺序执行可以这样p1.start() p1.join() p2.start() p2.join()3. 获取进程编号os.getpid()与os.getppid()有时候我们需要知道当前进程的 ID 或父进程 ID以便调试或管理。import os print(f当前进程 PID{os.getpid()}) print(f父进程 PPID{os.getppid()})4. 保护主进程入口if __name__ __main__在 Windows 系统上创建子进程时会重新导入主模块如果没有这个保护子进程会再次执行创建进程的代码导致无限递归。强烈建议在所有平台上都加上。if __name__ __main__: p multiprocessing.Process(targetsome_func) p.start()上篇小结多任务能显著提升程序效率进程是其中一种实现方式。每个进程拥有独立的内存空间互不干扰。使用multiprocessing.Processstart()即可创建子进程。join()控制同步等待os.getpid()获取编号if __name__ __main__必不可少。有了这些基础下篇我们将进一步学习进程锁、进程池以及一些重要注意事项。

更多文章