11.python并发入门(part1 初识进程与线程,并发,并行,同步,异步)

简介:

一、什么是进程?

在说什么是进程之前,需要先插入一个进程切换的概念!

进程,可以理解为一个正在运行的程序。

现在考虑一个场景,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停。这当然没问题,但这里有一个关键词:切换。

既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录程序A和程序B分别需要什么资源,怎样去识别程序A和程序B等等既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录程序A和程序B分别需要什么资源,怎样去识别程序A和程序B等等既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录程序A和程序B分别需要什么资源,怎样去识别程序A和程序B等等


简单说了进程切换的概念,接下来就来说说进程的定义吧。

进程,一般由三部分组成,分别是程序,数据集(这个程序里的数据),进程控制块三个部分组成,

我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

二、什么是线程?

1.多线程的引入

假如,一个编辑器程序,需要去接收键盘的输入,还需要把内容输出到屏幕上,还需要把内容写到硬盘中,如果只有单进程的话,就会造成同一时间只能做一件事的情况,(比如说,在将文本保存到硬盘,还没有保存完之前不能做其他事情)。

接下来可以试试开多个线程,为这个程序的每一个功能去开一个线程,进程A去接收用户键盘的输入,进程B把用户输入的内容显示在屏幕上,进程C负责把文本数据保存到硬盘。

这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西,这个东西就是文本的内容!!(这也就是之前提到进程中数据集的概念!)

若是这几个进程之间要互相协作,必须要把数据资源保存给每个进程!,有多个进程,原来的数据集就会有多份!


在这就需要引入一个概念,也就是说不同进程之间的数据集都是独立的!默认是无法共享的!

这几个进程在不停切换的时候,会造成性能上的损失,这是因为进程和进程之间的数据资源都是独立的!!


遇到这种情况,推荐使用多线程。

还拿刚说到的文本编辑器的程序来举例,假如有一种机制,可以分别使任务A,任务B,任务C共享一个数据集,这样,在cpu上下文切换的时候,所需要保存和恢复的内容就会少很多!并且又可以减少进程之间通信所带来的损耗! 这种机制就是多线程!!


我们可以把多线程理解为一个轻量级的多进程。

线程是cpu的最小执行单元,同时也是程序执行的最小单元。


线程是由“线程id”,“程序计数器”,“集合”,“堆栈” 共同组成的。

线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。


不过需要注意的是!!线程并没有自己的数据集!!


三、进程和线程之间的关系。

1.线程可以理解为是进程的实体。

2.一个进程中至少必须包含一个线程。

3.一个线程只能分配给一个进程,一个进程可以有多个线程。(我们也可以理解为进程是线程的容器。)

4.cpu在分配资源(数据集)的时候,只能把资源分配给进程!!!

5.真正放在cpu上运行的是线程。


四、并行与并发的概念。

并行处理(Parallel Processing) :并行处理是计算机可以同时执行多个处理的一种计算方法。

(并行处理的主要目的是节省大型和复杂问题的解决时间)


并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个CPU上运行,但任一个时刻点上只有一个程序在CPU上运行。


并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。



五、同步与异步

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。举个例子,打电话时就是同步通信,发短息时就是异步通信。


六、补充说明。

  1. 什么情况下会触发进程的切换?

    1.1出现I/O操作

    1.2这个进程运行的时间超出了cpu分配给它的时间片。

  2. 进程和线程。

    2.1 进程:资源管理单位(线程的容器)。

    2.2 线程:最小的执行单位。


3.多线程和多进程的应用场景。

对于计算密集型的任务,在python中使用多线程是完全没有意义的!!甚至可能会让程序变得更慢,在python下,对于计算密集型的任务,推荐使用多进程!(这种现象完全是全局解释器锁的特性导致的。)


对于I/O密集型的任务,推荐使用多线程。



      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1923953,如需转载请自行联系原作者






相关文章
|
7月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
855 7
|
8月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
559 1
|
7月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
1476 1
Python API接口实战指南:从入门到精通
|
7月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
1257 1
|
8月前
|
调度 数据库 Python
Python异步编程入门:asyncio让并发变得更简单
Python异步编程入门:asyncio让并发变得更简单
434 5
|
8月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
869 2
|
存储 Java 调度
Python 并行任务技巧
Python的并发处理能力臭名昭著。先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念。大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节。这些资料讲的都是虎头蛇尾,到了真正实际使用的部分却草草结束了。
388 0
Python 并行任务技巧
|
8月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1249 102
|
8月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
458 104
|
8月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
355 103

热门文章

最新文章

推荐镜像

更多