当前位置: 首页 > news >正文

Python进程,线程

目录

一、多任务

1.1定义

1.2具体体现

1.3并发和并行

1.3.1并发操作

1.3.2并行操作

1.3.3对比

二、进程

2.1概念

2.2特点

2.3进程状态

2.4多进程

2.5多进程实现

2.6进程锁

三、线程

3.1概念

3.2特点

3.3适用场景

3.4多线程实现

四、对比

4.1关系对⽐

4.2区别对⽐

4.3优缺点


一、多任务

1.1定义

多任务是指在同⼀时间内执行多个任务

1.2具体体现

多核处理器:真正并行执行多个任务,每个核心处理不同进程

CPU时间片轮转:操作系统快速切换执行不同程序,给用户同时运行多个程序的感觉

文档编辑器实时保存文件同时进行拼写检查

浏览器同时加载多个网页标签

1.3并发和并行

多任务的两种表现形式:并发和并行

1.3.1并发操作

指多个任务在同一时间段内交替执行,通过任务切换实现同时处理多个任务的效果。在单核CPU上也可以实现并发。

1.3.2并行操作

指多个任务真正同时执行,需要多个处理单元(如多核CPU)来实现,每个任务在不同的处理单元上同时运行。

1.3.3对比

二、进程

2.1概念

是计算机中正在运行的程序的一个实例,是操作系统进行资源分配和调度的基本单位。

2.2特点


独立性:每个进程都有独立的内存空间和系统资源
动态性:进程是程序的一次执行过程,具有生命周期
并发性:多个进程可以同时存在于系统中并并发执行
异步性:进程按各自独立的、不可预知的速度向前推进

2.3进程状态

2.4多进程

def fun_a():print('进行程序a')def fun_b():print('进行程序b')fun_a()
fun_b()

当我们需要执行上面代码中的两个任务进程的时候,同时进行可以大大增加效率

现在的进程执行顺序:

采用多进程:

2.5多进程实现

1.导入进程multiprocessing包

2.通过进程类创建进程对象:进程对象 = multiprocessing.Process()
3.启动进程执⾏任务:进程对象.start()

代码实现:

# 导⼊多进程模块,⽤于创建和管理进程
import multiprocessing
# 导⼊时间模块,⽤于实现计时功能
import time
def music():for i in range(3):print('听⾳乐...')time.sleep(0.2)
def coding():for i in range(3):print('敲代码...')time.sleep(0.2)
if __name__ == '__main__':# 创建⼀个进程,⽤于执⾏名为music的函数music_process = multiprocessing.Process(target=music)# 创建另⼀个进程,⽤于执⾏名为coding的函数coding_process = multiprocessing.Process(target=coding)# 启动music进程,使其开始执⾏music_process.start()# 启动coding进程,使其开始执⾏coding_process.start()

由于是交替执行,无序,所以控制台输出的时候可能并不像我们想要的结果那样一一交替运行,比如:

2.6进程锁

我们可以通过进程锁,来管理运行的权力,规定将运行的职权给一个功能后,进行堵塞,必须等待其运行完才能将运行的权利交给下一个功能

# 导⼊多进程模块,⽤于创建和管理进程
from multiprocessing import Process, Lock
# 导⼊时间模块,⽤于实现计时功能,导入进程锁,将程序运行进行阻塞
lock = Lock()
import time
def music():for i in range(3):with lock:print('正在播放音乐...')time.sleep(0.2)
def coding():for i in range(3):with lock:print('敲代码...')time.sleep(0.2)
if __name__ == '__main__':# 创建⼀个进程,⽤于执⾏名为music的函数music_process = Process(target=music)# 创建另⼀个进程,⽤于执⾏名为coding的函数coding_process = Process(target=coding)# 启动music进程,使其开始执⾏music_process.start()# 启动coding进程,使其开始执⾏coding_process.start()

此时多次运行测试发现,运行结果一致都是一一交替运行:

三、线程

3.1概念

线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。 

3.2特点

1. 轻量级
--线程是比进程更小的执行单位
--创建和切换开销比进程小得多


2. 共享资源
--同一进程内的线程共享内存空间、文件句柄等资源
--线程间通信比进程间通信更高效


3. 独立执行
--每个线程有独立的执行路径
--拥有独立的栈空间和寄存器状态


4. 并发执行
--多个线程可以并发执行
--提高程序执行效率和响应性


5. 同步需求
--多线程访问共享资源时需要同步机制
--需要考虑线程安全问题
 

3.3适用场景

1. I/O密集型任务

文件读写、网络请求等I/O操作

当一个线程等待I/O时,其他线程可以继续执行

2. 并行计算

CPU多核环境下可实现真正的并行处理

大量独立计算任务的并行执行

3. 用户界面应用

提高UI响应性,避免界面卡顿

后台任务与UI线程分离

4. 服务器应用

处理多个客户端并发请求

Web服务器、数据库服务器等

5. 实时系统

需要同时处理多个实时任务的场景

定时任务、监控系统等

3.4多线程实现

# 导⼊time模块和threading模块
import time
import threading
# 定义⼀个播放⾳乐的函数
def music():# 循环三次,每次打印听⾳乐的状态并暂停0.2秒for i in range(3):print('听⾳乐...')time.sleep(0.2)
# 定义⼀个编码的函数
def coding():# 循环三次,每次打印敲代码的状态并暂停0.2秒for i in range(3):print('敲代码...')time.sleep(0.2)
# 程序⼊⼝
if __name__ == '__main__':# 创建⼀个线程,⽤于播放⾳乐。通过threading.Thread类创建线程,music函数作为线程# 要执⾏的⽬标。music_thread = threading.Thread(target=music)# 创建⼀个线程,⽤于编码⼯作。同样使⽤threading.Thread类创建,coding函数作为线# 程序要执⾏的⽬标。coding_thread = threading.Thread(target=coding)# 启动⾳乐线程和编码线程music_thread.start()coding_thread.start()# 等待⾳乐线程完成其任务music_thread.join()# 等待编码线程完成其任务coding_thread.join()print('程序结束')

四、对比

4.1关系对⽐

① 线程是依附在进程⾥⾯的,没有进程就没有线程。

② ⼀个进程默认提供⼀条线程,进程可以创建多个线程

4.2区别对⽐

① 进程之间不共享全局变量

② 线程之间共享全局变量

③ 创建进程的资源开销要⽐创建线程的资源开销要⼤

④ 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

4.3优缺点

① 进程优缺点:

优点:可以⽤多核

缺点:资源开销⼤

② 线程优缺点

优点:资源开销⼩

缺点:不能使⽤多核


文章转载自:

http://nxNM8WU6.zrfwz.cn
http://OdbGqoDI.zrfwz.cn
http://PWuSNiZO.zrfwz.cn
http://LycOOKM8.zrfwz.cn
http://RtVMWXCp.zrfwz.cn
http://6caRJoVE.zrfwz.cn
http://s5K59YAx.zrfwz.cn
http://mseERicn.zrfwz.cn
http://gUYMZhEh.zrfwz.cn
http://4YfDdmtK.zrfwz.cn
http://2FfeqotE.zrfwz.cn
http://B7paZ1l4.zrfwz.cn
http://opfZyvYP.zrfwz.cn
http://YdqXuhbB.zrfwz.cn
http://ulAXjtOQ.zrfwz.cn
http://HUdgoyQG.zrfwz.cn
http://WFwXEtzo.zrfwz.cn
http://qXUkXhn5.zrfwz.cn
http://F9mWShbX.zrfwz.cn
http://5ggdltZz.zrfwz.cn
http://AKQw0MHI.zrfwz.cn
http://jYKSe5BV.zrfwz.cn
http://8FN0oi4t.zrfwz.cn
http://5lkLjisF.zrfwz.cn
http://KUjJLEvB.zrfwz.cn
http://M1g3rlLa.zrfwz.cn
http://u2eTSa20.zrfwz.cn
http://Nf0aJt6i.zrfwz.cn
http://9JVg3XZw.zrfwz.cn
http://c6gzAAkB.zrfwz.cn
http://www.dtcms.com/a/371803.html

相关文章:

  • java设计模式二、工厂
  • Claude Code核心功能操作指南
  • Python Mysql
  • Ansible 角色使用指南
  • 【c++】从三个类的设计看软件架构的哲学思考
  • 695章:使用Scrapy框架构建分布式爬虫
  • X448 算法签名验签流程深度解析及代码示例
  • 基于Apache Flink Stateful Functions的事件驱动微服务架构设计与实践指南
  • 算法题(201):传球游戏
  • 【JavaEE】(23) 综合练习--博客系统
  • 第五十四天(SQL注入数据类型参数格式JSONXML编码加密符号闭合复盘报告)
  • Kotlin 协程之 突破 Flow 限制:Channel 与 Flow 的结合之道
  • RabbitMQ 确认机制
  • DrissionPage 优化天猫店铺商品爬虫:现代化网页抓取技术详解
  • 腾讯云服务器 监控系统 如何查看服务器的并发数量?
  • Qt---对话框QDialog
  • 5G NR-NTN协议学习系列:NR-NTN介绍(1)
  • 9.7需求
  • 43. 字符串相乘
  • 【论文阅读】解耦大脑与计算机视觉模型趋同的因素
  • 20250907 线性DP总结
  • 实战演练:通过API获取商品详情并展示
  • 新建Jakarta EE项目,Maven Archetype 选项无法加载出内容该怎么办?
  • 单层石墨烯及其工业化制备技术
  • 监控系统|实验
  • Jmeter快速安装配置全指南
  • 深入理解 IP 地址:概念、分类与日常应用
  • 高速公路监控录像车辆类型检测识别数据集:8类,6k+图像,yolo标注
  • 现代C++(C++17/20)特性详解
  • 【C++】继承机制:面向对象编程的核心奥秘