python网络编程基础(线程与进程并行与并发同步与异步)
Posted -零
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python网络编程基础(线程与进程并行与并发同步与异步)相关的知识,希望对你有一定的参考价值。
python网络编程基础(线程与进程、并行与并发、同步与异步)
目录
线程与进程 并行与并发 同步与异步
线程与进程
进程
前言
进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时
,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就
需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之
为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有:地址空间,全局变量,文件描述符,各种硬件等等资源。
进程的定义
首先进程不是程序!!! 进程是个抽象的概念 进程:最小的资源单位 进程就是一个程序在一个数据集上的一次动态执行过程 进程一般由程序、数据集、进程控制块三部分组成 我们编写的程序用来描述进程要完成哪些功能以及如何完成 数据集则是程序在执行过程中需要使用的资源。 进程控制块用来记录进程的外部特征。描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
线程
前言
线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一
个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘
中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西-------文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内
容就少了,同时又可以减少通信所带来的性能损耗,那就好了。是的,这种机制就是线程。线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等。 此时,进程同时也是线程
的容器。线程也是有着自己的缺陷的,例如健壮性差,若一个线程挂掉了,整一个进程也挂掉了,这意味着其它线程也挂掉了,进程却没有这个问题,一个进程挂掉,另外的进程还是活着。
线程的定义
线程:最小的执行单位 一个进程中可以开多个线程,为什么要有进程,而不做成线程呢?因为一个程序中,线程共享一套数据,如果都做成进程,每个进程独占一块内存,那这套数据就要复制好几份给每个程序,不合理,所以有了线程。 线程又叫轻量级进程,是一个基本的cpu执行单元,也是程序执行过程中的最小单元。一个进程最少也会有一个主线程,在主线程中通过threading模块,在开子线程 进程下的执行单位 而进程相当于线程的容器 也需要注意进程下面还可以继续创建进程 当然线程最大的特点就是共享这个进程的所有资源
程序运行的原理
分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。 抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。 大部分操作系统都支持多进程并发运行,现在的操作系统几乎都支持同时运行多个程序。比如:现在我们上课一边使用编辑器,一边使用录屏软件,同时还开着画图板,dos窗口等软件。此时,这些程序是在同时运行,”感觉这些软件
好像在同一时刻运行着“。 实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
总结
1.一个程序至少有一个进程,一个进程至少有一个线程,(进程可以理解成线程的容器) 2.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率 3.线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制 4.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是cpu调度和分配的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是它可与同属一个进程的
其他的线程共享进程所拥有的全部资源 5.cpu分配给线程,即真正在cpu上运行的是线程
6.一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可以并发
并行与并发
并行
并行就是指同一时刻有两个或两个以上的“工作单位”在同时执行,从硬件的角度上来看就是同一时刻有两条或两条以上的指令处于执行阶段。所以,多核是并行的前提,单线程永远无法达到并行状态。可以利用多线程和度进程到达并
行状态。另外的,Python的多线程由于GIL的存在,对于Python来说无法通过多线程到达并行状态。 并行处理是指计算机系统中能同时执行两个或多个任务的计算方法,并行处理可同时工作于同一程序的不同方面。
并发
并发 对于并发的理解,要从两方面去理解 1.并发设计 2.并发执行。 先说并发设计,当说一个程序是并发的,更多的是指这个程序采取了并发设计。 并发设计的标准:使多个操作可以在重叠的时间段内进行 ,这里的重点在于重叠的时间内, 重叠时间可以理解为一段时间内。例如:在时间1s秒内, 具有IO操作的task1和task2都完成,这就可以说是并发执行。所以呢,单线程
也是可以做到并发运行的。当然啦,并行肯定是并发的。 一个程序能否并发执行,取决于设计,也取决于部署方式。例如, 当给程序开一个线程(协程是不开的),它不可能是并发的,因为在重叠时间内根本就没有两个task在运行。当一个程序被设计成完成一个任务再去完成下一个任务的
时候,即便部署是多线程多协程的也是无法达到并发运行的。
总结
并发:是指系统具有处理多个任务(动作)的能力 并行:是指系统具有同时处理多个任务(动作)的能力 并行与并发的关系: 并发的设计使到并发执行成为可能,而并行是并发执行的其中一种模式 并发处理是同一时间段内有几个程序都在一个cpu中处于运行状态,但任一时刻只有一个程序在cpu上运行。
同步与异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
同步
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由*调用者*主动等待这个*调用*的结果。
当进程执行到一个IO操作(等待外部数据)的时候,一直等待外部数据,接收到数据后,再继续运行
异步
异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
当进程执行到一个IO操作(等待外部数据)的时候,不主动等待数据,一边执行别的任务,外部数据发送过来,接收到数据再回来继续运行。
以上是关于python网络编程基础(线程与进程并行与并发同步与异步)的主要内容,如果未能解决你的问题,请参考以下文章