多进程\多线程\多协程 傻傻分不清 ? 一文读懂
引言—Python中的多任务
无论是多进程还是多线程 本质都是多任务 通过多个任务同时处理的方式 可以大大提高程序的执行效率
比如电脑安装的Windows系统 就是多任务操作系统 可以同时运行多个软件
多任务有两种表现形式 一种是并发 一种是并行 并发是指在一段时间内去快速切换 交替完成多个任务 就像一位技艺精湛的大厨 可以同时进行切菜 炒菜 煮汤等工作 但并不是真的在同时操作 而是煮了汤 去切菜 切好了菜又烧油 快速切换 看起来像是在同步进行多项工作
而并行则是多个大厨同时炒菜 是真正的在同时处理多个任务
什么是多进程?
要想实现多任务 可以用多进程来完成
进程(process)是操作系统资源分配和调度运转的基本单位 一个正在运行的程序就是一个进程 比如微信 QQ
创建多进程的方法也十分简单 分为三个步骤:
1️⃣导入进程包:import multiprocessing
2️⃣通过进程类创建进程对象:进程对象 = multiprocessing.Process(target = 任务名)
ps:此处的任务明可以是一个方法或函数或功能 多为自定义
3️⃣启动该进程执行任务:进程对象.start()
在创建多进程之前 可以先把自己需要的功能定义好 然后在process()中调用即可
需要注意的是 在Python程序中 当前py文件是主进程 通过多进程创建的是子进程 但当Python调用了子进程中的任务或函数后 程序会从头开始重新读取 当再次读到process的时候 又会创建新的子进程(孙进程) 再次从头读取 再次创建子进程(曾孙进程)
所以为了解决这个问题 建议在进程创建代码块前加上 ‘’ if name == ‘main’: ‘’ 语句判断是否为主进程 是则创建子进程 这样则可以避免循环创建子进程
什么是多线程?
线程是程序执行的最小单元 进程实际上只负责分配资源 而真正利用这些资源执行任务的是线程
如果把进程看作一个餐厅的后厨 而线程就是后厨中干活儿的厨师
多线程创建的方法与进程十分相似 只需要更改模块名称:
1️⃣导入线程包:import threading
2️⃣通过线程类创建进程对象:线程对象 = threading.Thread(target=任务名)
3️⃣启动该线程执行任务:线程对象.start()
注意:与进程不一样 进程是一个个独立的厨房 之间互不干扰 独立使用各自占有的资源 而线程则是多个同时干活的厨师 对操作系统的资源利用是快速替换的 也就是高并发 是一种抢占式的工作方法
相关的基本语法
接下来介绍几个与进程\线程相关的语法
1️⃣进程:
获取当前进程编号: os.getpid() — 根据os包 ; multiprocessing.current_process().pid — 根据multiprocessing包
销毁进程: 进程.terminate() ; 进程.daemon = True ; 进程.kill() —强制立即终止并销毁 慎用
传递参数:进程= multiprocessing.Process(target=任务名, args=(1,2,3 )) — 元组
进程 = multiprocessing.Process(target=任务名, kwargs={‘num1’: 1,‘num2’: 2}) — 字典
2️⃣线程:
与进程一致 更改模块名即可
多进程 vs 多线程 vs 多协程 有何异同?
进程\线程\协程可以说是一种逐层向下兼容的关系 进程由操作系统分配 大致可以有几十个 其下又可以创建几百个线程 每个线程下又包含成千上万个协程
进程中的全局变量是私有的 如果创建了一个空列表list = [] ,子进程调用并不会改变list本身 但线程中的全局变量是共享的 任何一个子线程调用都会改变它的内容
进程占用资源极大 线程其次 协程最小
进程是真实并行 每个进程独立运行 互不干扰 线程是伪并行(即并发) 是通过高速替换执行任务达到看似同时处理的效果 协程也是伪并行 本质也是高速替换执行任务
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)