news 2026/6/9 12:20:24

【Python 并发编程①】多任务 进程(Process)入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python 并发编程①】多任务 进程(Process)入门

【Python 并发编程①】多任务 & 进程(Process)入门:并发/并行、multiprocessing、参数传递、join、守护进程、PID 一次搞懂

文章目录

  • 1)什么是多任务
  • 2)并发 vs 并行
  • 3)进程(Process)是什么?
  • 4)用 multiprocessing 创建进程:start / join(核心)
  • 5)给进程传参:args / kwargs
  • 6)主进程和子进程结束顺序:daemon / terminate(常见坑)
      • 方式 A:守护进程 daemon=True(主进程一结束,子进程跟着没)
      • 方式 B:terminate() 强行终止
  • 7)进程编号:getpid / getppid
  • 8)进程的坑:为什么“进程不共享全局变量”(重点!)
  • 9)本篇小结

1)什么是多任务

多任务是指在同⼀时间内执行多个任务,好处是更充分利用 CPU,提高程序效率。

“边听歌边写代码”就是最经典例子:两个任务如果串行(一个做完再做另一个),就慢;能同时推进,就快。

2)并发 vs 并行

这是最容易被一句话讲糊的地方,我按“人话版”理解:

  • 并发(Concurrency):看起来同时在做,其实是在轮流切换。一个人同时做两件事(不断切换)

  • 并行(Parallelism):真的同时做,多个核心一起干。两个人各做一件事(真同时)

3)进程(Process)是什么?

进程是资源分配的最小单位,通俗点:一个正在运行的程序就是一个进程(比如正在运行的微信、QQ)。

可以理解成:

  • 进程 = 操作系统给你开的一间“独立办公室”(内存空间、资源都有自己的一套)
  • 线程 = 办公室里干活的人(这一章先不展开)

4)用 multiprocessing 创建进程:start / join(核心)

标准的三步走:导入模块 → 创建 Process → start 启动。

可运行示例:两个进程同时执行

importmultiprocessingimporttimedefmusic():for_inrange(3):print("听音乐...")time.sleep(0.2)defcoding():for_inrange(3):print("敲代码...")time.sleep(0.2)if__name__=="__main__":p1=multiprocessing.Process(target=music)p2=multiprocessing.Process(target=coding)p1.start()p2.start()# 等待两个子进程结束再往下走# p1.join()# p2.join()# print("主进程结束")

注意上述代码没有添加join函数

当我运行代码后,输出顺序不固定:有时先音乐,有时先代码。这时候就要引入join()

join() 的意义:主进程等子进程做完再继续

5)给进程传参:args / kwargs

参数传递分成两种:

  • args:元组形式的位置参数

  • kwargs:字典形式的关键字参数

示例代码:

importmultiprocessingimporttimedefmusic(num):foriinrange(num):print(f"听音乐...第{i+1}次")time.sleep(0.2)defcoding(count=3):foriinrange(count):print(f"敲代码...第{i+1}次")time.sleep(0.2)if__name__=="__main__":p1=multiprocessing.Process(target=music,args=(3,))# args 必须是元组p2=multiprocessing.Process(target=coding,kwargs={"count":4})# kwargs 是字典p1.start()p2.start()p1.join()p2.join()print("主进程结束")

最容易错的点!!!

args=(3) 不是元组,必须写成 args=(3,)

6)主进程和子进程结束顺序:daemon / terminate(常见坑)

很多人第一次写会遇到:

  • 主进程打印“结束了”

  • 子进程还在“工作中…”

  • 或者反过来,你以为子进程会跟着结束,结果它还在跑

这里介绍两种处理方式:守护进程 / 销毁子进程。

方式 A:守护进程 daemon=True(主进程一结束,子进程跟着没)

importmultiprocessingimporttimedefwork():for_inrange(10):print("工作中...")time.sleep(0.2)if__name__=="__main__":p=multiprocessing.Process(target=work)p.daemon=True# 关键:守护主进程p.start()time.sleep(1)print("主进程执行完毕(子进程会被带走)")

方式 B:terminate() 强行终止

importmultiprocessingimporttimedefwork():for_inrange(10):print("工作中...")time.sleep(0.2)if__name__=="__main__":p=multiprocessing.Process(target=work)p.start()time.sleep(1)p.terminate()# 强制终止子进程print("主进程执行完毕(我手动掐掉了子进程)")

小提醒:terminate() 属于“强制掐电源”,能不用就别滥用。

7)进程编号:getpid / getppid

“父进程”是指在操作系统中,创建了当前进程的进程。在多进程的环境中,⼀个进程可以创建其他进程,被创建的进程称为子进程,而创建它的进程就是父进程。

  • os.getpid():当前进程 ID
  • os.getppid():父进程 ID(创建它的那个进程)
importmultiprocessingimportosimporttimedefworker(name):print(name,"pid =",os.getpid(),"ppid =",os.getppid())time.sleep(0.5)if__name__=="__main__":print("主进程 pid =",os.getpid())p1=multiprocessing.Process(target=worker,args=("子进程A",))p2=multiprocessing.Process(target=worker,args=("子进程B",))p1.start()p2.start()p1.join()p2.join()

8)进程的坑:为什么“进程不共享全局变量”(重点!)

子进程启动时会把主进程资源“拷贝一份”(像复制了一个副本),所以每个进程都有自己的那份全局变量,你改的是“副本”,不是同一个。

importmultiprocessingimporttime my_list=[]# 全局变量defwrite_data():foriinrange(3):my_list.append(i)print("write add:",i,"list =",my_list)defread_data():print("read list =",my_list)if__name__=="__main__":p1=multiprocessing.Process(target=write_data)p2=multiprocessing.Process(target=read_data)p1.start()time.sleep(1)p2.start()p1.join()p2.join()print("主进程最终 list =",my_list)

运行后可以看到:

write add: 0 list = [0]
write add: 1 list = [0, 1]
write add: 2 list = [0, 1, 2]
read list = []
主进程最终 list = []

9)本篇小结

  • 多任务是为了提高效率,分并发/并行两种

  • 进程是资源分配单位,彼此内存隔离

  • 进程创建:Process(target=…) → start() → join()

  • 传参:args=(…)、kwargs={…}

  • 生命周期:daemon=True 或 terminate()

  • 调试必备:getpid() / getppid()

  • 最大坑:进程不共享全局变量(别跟它死磕,记住就行)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/19 13:06:46

空洞骑士模组管理器Scarab:5分钟快速上手指南

空洞骑士模组管理器Scarab:5分钟快速上手指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为《空洞骑士》模组安装的繁琐流程而烦恼吗?Scarab模…

作者头像 李华
网站建设 2026/5/3 4:13:42

XGBoost极速安装全平台配置指南

XGBoost极速安装全平台配置指南 【免费下载链接】xgboost dmlc/xgboost: 是一个高效的的机器学习算法库,基于 C 开发,提供用于提升分类、回归、排序等任务的性能。 项目地址: https://gitcode.com/gh_mirrors/xg/xgboost 想要快速上手XGBoost机器…

作者头像 李华
网站建设 2026/6/10 9:15:03

ZSTD压缩算法简单测试

背景特性维度Zlib (DEFLATE)Zstd (Zstandard)核心算法LZ77 霍夫曼编码 (诞生于1990年代)现代LZ变体 有限状态熵/tANS (第一版于FaceBook公司发布2016)设计哲学寻求压缩率与速度的平衡,侧重于高压缩率。首要追求速度(尤其是解压速度)&#x…

作者头像 李华
网站建设 2026/5/31 12:59:22

【计算机毕业设计案例】基于python-CNN深度学习对宠物体型识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/12 0:26:10

一篇文章说透FunctionCall,MCP和Skill

关于大模型生态中新出现的“Skill”(技能),核心指的是Anthropic为其Claude模型推出的 “Claude Skills”。你可以将其理解为一种模块化、可复用的AI能力扩展包,它让AI从一个“会聊天的助手”升级为能自动化执行专业任务的“打工人…

作者头像 李华