Python说文解字_Python之多任务_01

Python 之 多任务:

  Python之多任务是现在多任务编程运用Python语言为载体的一种体现。其中涵盖:进程、线程、并发等方面的内容,以及包括近些年在大数据运算、人工智能领域运用强大的GPU运算能力实现的各种算法。属于Python语言中比较高级的应用形式。文章采取问答的形式对知识点和相关应用的模式进行详解,看似像意识流形态的文章,其内容也是遵循循序渐进,力求全面和精细。

问:什么是多任务?

答:百度定义:“当多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务。”也就是说操作系统可以同时运行多个任务。这个概念是基于操作系统来说的。比如电脑同时开启多个软件或者应用程序,这就是一种多任务的体现;于此相对如果我们电脑只能每次开启一个软件或者一个应用程序,关闭前者才能开启后者这就叫做单任务,在早期的电脑基本都属于单任务,对于现在的计算机应用基本上都属于多任务的形式存在,因此我们也只讨论多任务。

问:CPU是整个运算的核心,CPU、操作系统、多任务之间的关系什么?

答:1. 现在的CPU基本上都是2核以上的CPU,如果我们现在手里有一台单核的CPU和一台多核CPU,我们的多任务在上面又是怎么实现的呢?

    1.1. 单核CPU实现多任务原理?

      操作系统轮流让各个任务交替执行,CPU对每个任务进行“时间切片”的动作,这个切片时间非常短暂,打个比方,一整块的奶酪难以下咽,我们把奶酪切成一小块一小块的,让我们的CPU以飞快的速度进行“吞噬”。同样我们比如有N个任务,把每一个任务切成“时间切片”,如此交替往复的切换运行。这样表面上看像是多任务一起执行,但是CPU调度执行速度太快了,导致我们感觉所有任务都是同事执行一样。

    1.2. 多核CPU实现多任务原理?

      真正的并行执行多任务只能在多核CPU上实现,但是任务数量远远多于CPU核心数量,所以操作系统会把很多任务轮流调度到每个核心上执行。和单核CPU实现多任务原理相比,多核CPU真正实现了“多窗口”的轮流调度任务。

    1.3. 打个比方,单核CPU就像银行开一个窗口来处理任务,多核CPU开多个窗口来处理任务。这个任务之间的调度是通过操作系统来完成的。

  2. CPU核和线程是一个什么概念?

    这里再稍微扩展一下:我们说一下CPU的主频、核心、线程、架构。

    CPU是整个计算机的大脑。

    主频:我们经常看到CPU参数当中有3.0GHz、3.7GHz等,这就是CPU的主频,严谨的说他是CPU的时钟频率,也可以直接理解为运算速度。主频越大力量越大。

    核心:我们常常说计算机是几核心的。主频我们可以理解为肌肉,核心我们可以理解为胳膊,如果你有16条胳膊(也就是16核心),你所能干的事情也是越多。直观来看在CPU中心隆起的芯片就是核心,是由单晶硅以一定的生产工艺制造出来的。每一个CPU核心都有自己固定的逻辑结构,一级缓存、二级缓存,执行单元、指令集单元和总线接口等。打个比如,一条胳膊都有肌肉,骨骼、神经、血管等一套逻辑系统。

    线程:有了胳膊还必须有手才能工作。一般来说单核配单线程,双核配双线程。也就说一条胳膊配一只手。但是我们有些CPU比如4核8线程,也就是说有4条胳膊,每条胳膊配2只手(看起来有点儿恐怖了),但是这样多造出来的两只手,干活的效率就大大的提高了。

    架构:现在有了肌肉、胳膊、手,就差一个工具就可以干活了,这就是CPU的架构,架构对刑恩该影响巨大。比如现在通行的ARM架构等。

  3. 关系:

    计算机通过操作系统,把多个任务调度到CPU的核心上进行计算,他们之间是载体和对象,实现和被实现、调度和被调度之间的关系。

问:并行和并发是什么概念?

答:并发:看上去是一起执行,任务多于CPU核心数。

  并行:真正一起执行,任务数小于CPU核心数。

  再直观的理解一下:并发(Concurrent):指两个或多个事件在同一时间间隔内发生,即交替做不同事的能力。并行(Parallel):指两个或多个事件在同一时刻发生,即同时做不同的能力。我们以进程举例:并发就像是我们前面说的单核CPU执行多任务的概念,交替执行,并行就像多核CPU执行多任务的概念,同时执行。再比如,我们现在有一个4核4线程的CPU,我们有5个任务一起发送给CPU,这个时候后可能是某几个程序并行一起运行,其他多于的1个任务交替并发执行。如果我们现在只有4个任务,这样4个任务就可以完全“吃饱”了CPU的进程,就可以并行(当然这里是不考虑其他因素的情况下)。

问:进程、线程、任务都是什么东西?

答:进程:对于操作系统而言,一个任务就是一个进程。进程是系统中程序执行和资源分配的基本单位。每个进程都有自己的数据段、代码段、堆栈段。

  线程:在一个进程的内部,要同时干多件事情(就是手的问题),就需要同时运行多个子任务,我们把进程内的这些子任务叫做线程。也就是说线程是进程的子任务。

  线程通常叫做情景进程。线程是通过向内侧控件的并发执行的多任务。每个线程都共享一个进程的资源。线程是最小的执行单元,而进程至少由一个线程组成。如何调度进程和线程,完全是由操作系统决定,用户程序不能自己决定什么时候执行。执行多长时间。

  我们闭上眼睛形象的比喻一下,在线程这根柱子上面,子任务不断围绕这根柱子交替来执行(这是符合我们之前的单任务CPU的工作原理的),然后多根柱子又去并行多少个进程一起来执行。从实际运行的过程来看,任务在线程这个最小单元是并发执行的,在任务数小于CPU核心数的情况下,有可能还是并行执行的。并发是线程的经常运作模式,并行是总体的实际运行调度,微观来说任务都是在并发执行在线程上面的。

问:“抢占式”和协同式任务模式?

答:在windows3.x的时代,那个时候的程序运行任务基本上是依靠代码的编写逻辑进行的。当一个程序运行完毕后再运行下一个程序,这样做最大的风险就是如果一个程序出问题卡死就很容易出现死机的情况。抢占式任务模式,是现在基本的任务模式,比如现在我们开启了N个程序,现在我们在打字,这个优先级最高,我们就把它先推送给CPU让它先去执行,如果我们现在再打开一个程序,之前的打字的那个程序优先级退下,让当前的程序推送到最高的优先级。我们其实可以通过Windows的任务管理器去观察所有的当前任务。我们发现这些任务并不是按照一定有规律的顺序排列进行执行的,如果当前程序优先级很高它就是排在前面,而且我们如果静止不动去观察,他们的排序是会产生不断变化的。这就是“抢占式”任务模式。因此我们的程序在进程或者线程当中去运行的话,也是这种抢占式任务运行模式。

问:GIL在Python中的作用?

答:

原文地址:https://www.cnblogs.com/noah0532/p/11001485.html

时间: 2024-11-07 14:19:05

Python说文解字_Python之多任务_01的相关文章

Python说文解字_杂谈08

1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对象,然后贴便利贴. # 3. is 是指的标签贴是否一样. a = 1 b = 1 这个是一样,用的是小整数的内部inter机制的内部优化. == 用的是__eq__这个魔法函数. # 4. 常用的用法是isinstance或者type() is,这两种是通用的.type实际上是指向了这个对象的.

Python说文解字_继承过程中的参数集合

1. 先看一段属性继承的代码: class User: def __init__(self,name,age): self.name = name self.age = age class User1(User): def __init__(self,name,age,height,weight): self.height = height self.weight = weight # 此处像继承父类的name 和 age super().__init__(name, age) user1 =

Python说文解字_父类的继承

1. 第一个问题: 我们知道类是可以继承其他类的,在继承的过程中我们不光可以继承父类的方法,还可继承父类的属性,另外还可以在父类的基础上添加自己的东西. 2. 第二个问题: 我们继承父类属性和方法的时候无需再把父类的属性和方法再写一般.通常用的方法是:父类名.方法/属性,另外还有一种方式就是super().的方法.但其实这两种方式是有一些不同的. 首先举例第一种方式:父类名.方法/属性. 代码: class BaseClass: num_Base_calls = 0 def call_me(se

Python说文解字_杂谈05

1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() print(isinstance(b,B)) print(isinstance(b,A)) print(type(b) is B) print(id(type(b)),id(B)) # 2943616512536 2943616512536 2. 类变量和对象变量: 类中的self == 实例,其实就等于a

Python说文解字_杂谈06

1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.array 不可变序列:str.tuple.bytes 2. 序列的abc继承关系: 魔法函数构成了协议 3.序列的+ +=和extend的区别: my_list = [] my_list.append(1) my_list.append("a") from collections impor

嘻嘻哈哈说文解字(讲)

讲的左边是言,右边是井,我想,老祖宗造这个字的意思应该是:话是应该说,但不能说多,不能井边说,言空了就掉井里了(所谓言虚容易掉到井里面).但奈何我们的记忆总不好,只记住了左边的言,这不,你看我们天天都在讲道德,讲道理,讲公德,讲廉洁,讲大公无私....... 上层一边讲一边注水,中层一边讲一边捞钱,下层,边讲边能搞点啥算点啥. 精英一边讲爱国一边移民,大众一边讲爱国一边拆墙脚 ...... 我说这些绝不是说我们没有素质,没有道德,没有理想的.我们都是好人,确确实实的正派好人,这一切主要坏就坏在这

说文解字

1."五色土"中中央之土是什么颜色? 黄色 2."床前明月光"的"床"类似于今天的哪种家具?   茶几 3.小篆"思"字上半部分念什么?xìn 4.<千字文>集的哪位书法家的字?王羲之 5.<千字文>的作者是谁?周兴嗣 6.以下书籍中,哪些属于蒙学读物"三百千千"?<千字文><百家姓> 7.<千字文>撰成于梁代吗?√ 8.据顾炎武<日知录&g

说文解字----矩阵分析(二)特征值特征向量 奇异值分解(SVD)

特征值,奇异值,相关分解是矩阵分析中一个非常重要的概念,我再网上找了些资料,很多人已经对此分析的非常纯熟,为了尊重原创作者,首先贴几个链接,大家欣赏下: 外文链接:http://www.ams.org/samplings/feature-column/fcarc-svd 翻译文章:http://blog.csdn.net/dinosoft/article/details/37884597 数学之美与SVDhttp://blog.chinaunix.net/uid-24517893-id-3261

说文解字——傅里叶变换、拉普拉斯变换、Z变换 (上)

在开始了解这些变换之前,简单复习一下级数的概念: 级数的概念之所以重要,是因为我们现实生活中经常遇到一些不规则的函数,为了方便我们的研究,我们希望能有一种方法来用简单的多项式或者多个函数来近似表示这个函数,这就是我们研究级数的原因:任意一个函数都能用多项式逼近: 假定我们有一个函数f(x),他的曲线是不规则的,我们很难去探索这种曲线的性质,但是如果我们把这种曲线展开成f(x)=f(x0)+f′(x0)(x?x0)+.........,展开式中的函数式我们熟悉的,这样会更便于我们的分析.如果这个例