python编程理论_Python并发编程理论篇,来看看

其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住一个点:并发编程永远的宗旨就是提高程序的运行效率,也是围绕CPU来进行优化的一种技术手段。

像我们之前学习过的网络编程中,我们只是基于socketserver模块让我们的Server端有了处理多任务的能力,但是我们并不了解它的底层是怎么做到的,在学习完并发编程后,尝试自己阅读一下socketserver源码,你将会大有收获。

并发编程很重要吗?是的,非常重要,如果你想进入PythonWeb领域那么著名的框架如Django,Tornado,Flask等等底层都是有基于本章节的知识点,如果你想进入爬虫领域那就更不用说了,非常强大的scrapy框架也是基于我们所学的这些东西累积起来的。

好了废话不多说,让我们开始进入并发编程的学习吧。

从任务处理角度看待操作系统发展史

这一节主要是理论知识,了解计算机任务处理方式的演变过程,能够让我们更快的理解和学习并发编程。

首先,我们先来回顾一下操作系统方面的一些知识。

操作系统的作用:管理硬件,目的就是让用户更加方便的来操控计算机底层的硬件。

可以看到操作系统对于人们操控计算机进行作业有着不可小觑的功劳,那么在早期没有操作系统的时候你能想象是什么样子吗?现在我们来看一看。

无操作系统时任务的处理方式

早期的计算机并没有操作系统,而是通过纸带来进行程序的编辑,它有三台设备分别是:输入机,计算机,输出机。

这个时代的计算机一次只能跑一个人的程序,没有其他干扰,那么它的缺点也很明显,一次只能一个人使用而后面想要使用的人必须得等待前一个人用完之后才行。其执行效率非常低下,最关键的就是人在进行与计算机交互的时候计算机的运算器是没有任何工作的,这就造成了资源上极大的浪费,那么这种浪费可以理解为I/O阻塞。

为了解决这个问题,批处理系统横空出世了。

批处理系统的诞生

相比于前一代计算机处理任务的方式,批处系统的诞生让这一代计算机有了极大的进步,并且输入也不再使用纸带,而是采用磁带,批处理操作系统可以将多个用户的任务同时提交(但是不能同时运行)。

假设有三个程序员需要使用这台计算机,他们将自己的程序全部交由一个程序员让其进行人机之间的交互,那么这样就节省了三倍的时间。但是这样的缺点也很明显,只能等待三个人的程序全部处理完后大家才能拿到各自的结果,这个等待过程是十分漫长的。

在这里,出现了一种自动化的工作方式,计算机也就是中间的7094机器能够去区分出每个程序员自己的程序,那么其内部肯定是由一种代码支持它有了这种功能,那个这个就是批处理系统。

单处理的批处理系统最大的缺点依然还是拥有I/O阻塞,能不能把中间的两个小人全部干掉让计算机来做他们做的事儿呢?当然可以,但是…当时的人还没那么聪明。

image-20200629232414224

我们再来想一个问题,如果程序员A的程序出错了,它第一时间拿不到,返回会一直卡在那,程序员B和程序员C也不用拿了,反正都出不来。是不是很蛋疼?

后来慢慢的经过时间的积累与技术的成熟,针对这一代的批处理系统的缺点,又出现了新一代操作系统。

多道程序设计与分时操作系统的诞生

在这一代操作系统中最先出现了一种技术,名叫SPOOLING技术,这个技术的出现让上图的两个小人下岗了。SPOOLING技术的出现极大的减少了I/O阻塞的时间,除此之外,该代操作系统还提出了一个非常重要的思想,即多道程序设计的思想,这个技术思想目前在我们的进程中依然存在,它的主要功能就是解决了顺序执行(串行)的问题。

image-20200629234014499

尽管这样做的确让程序效率提高了,但是我们还有一个问题。计算机中依然是批处理系统,还是要等A,B,C的叅櫊程序同时出结果才能拿到最终结果,这个时间太长了,就想上面说的如果程序员A的程序出错了卡住了程序员B和C的正常程序也取不出来。

有的人开始怀念最早的无操作系统时代的计算机了,太怀念了,我一个人的程序十分钟我就出来了,三个人的我要等三十分钟,如果有一个出错了我的等在久也出不来,我太难了…

为了解决这种问题,出现了极为牛逼的分时操作系统。

分时很形象的一个比喻就是一台电脑给A,B,C每个程序员一个键盘鼠标和显示器,大家共有一个主机各玩各的互不影响,都认为自己的程序是独享的并且马上就能看到自己程序的运行结果,你说牛不牛逼?大家都很开心,但是实际上大家还是共用的同一个CPU…(多用户多任务)。

分时操作系统到现在依然存在,并且还十分常见,比如许多人去操作同一台服务器。

这时候大家就在考虑,你丫键盘鼠标显示器啥都给我了,为啥不再给我一个主机呢?这其实还是受限于当时的成本条件,但是到了如今计算机的成本以及体积都下来后,这些都不是问题了。

个人操作系统的诞生

现在咱们大家都是用的个人操作系统,已经挺熟练了吧,这个玩意儿每个人都在玩,但是虽然大家不共有一个CPU了,其实在系统内部依然存在着切换,它就是进程或者线程之间的切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离 ### 4.2 区域分离与聚合 区域分裂合并算法的基本思想是将图像细分为一组…

多彩三角形

H5特效多才三角形&#xff0c;使用H5新特性canvas画布制作的四周阴影效果中部出现很多的各种颜色的三角形。 效果演示 代码演示 <!DOCTYPE HTML> <html><head><title>demo</title><style type"text/css">body {margin: 0;pa…

ado.net mysql 连接池_ADO.NET数据连接池

【IT168 技术文档】21世纪什么最贵&#xff1f;数据库连接。对于以数据库做数据存储基石的应用系统来说&#xff0c;数据库连接是整个系统中最珍贵的资源之一。数据库连接池是为了更有效地利用数据库连接的最重要措施。它对于一个大型的应用系统的性能至关重要&#xff0c;特别…

【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类

【OpenCV 例程200篇】 系列&#xff0c;持续更新中… 【OpenCV 例程200篇 总目录-202205更新】 【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类 5. 区域分割之聚类方法 5.1 基于 k 均值聚类的区域分割 聚类方法的思想是将样本集合按照其特征的相似性划分为若干类别…

计算名次和奖学金

使用Java的switch的判断计算学生的名次和对应的奖学金&#xff0c;根据文本提示输入你的名词&#xff0c;点击Enter之后会出现你应该获得的奖学金金额。 结果演示 代码演示 package com.eight; import java.util.Scanner; public class Mingci {public static void main(Str…

android反射开启通知_Android中反射的简单应用

自己对反射的理解和应用还处于比较浅显的阶段&#xff0c;写这篇文章更多在于整理总结&#xff0c;也就是帮助自己进一步的理解和学习反射机制。反射反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。java中类反…

【OpenCV 例程200篇 目录-202205更新】

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【OpenCV 例程200篇 目录】 更新日期&#xff1a;2022-05-12 【youcans 的 OpenCV 例程200篇】01. 图像的读取&#xff08;cv2.im…

最大值平均值和排序

根据文本提示输入五个年龄&#xff0c;点击Enter之后程序会输出五个年龄中最大的年龄&#xff0c;平均年龄即年龄从小到大的排序分别是啥。 结果演示 代码演示 package com.nine; import java.util.Scanner; import java.util.Arrays; public class Shuzu {public static v…

python的gui编程pyqt5_Python-GUI编程-PyQt5

章节1:Python-GUI编程-简介课时1Python-GUI编程-简介14:19课时2Python-GUI编程-GUI库的简介13:43课时3Python-GUI编程-PyQt的简介11:44课时4Python-GUI编程-PyQt的优势12:12章节2:Python-GUI编程-PyQt的环境安装课时5Python-GUI编程-PyQt的环境安装(win)09:25章节3:Python-GUI编…

【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割 5. 区域分割之聚类方法 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息&#xff0c;将图像分割为远超于目标个数、远小于像素数量的超像素块&…

判断三角形是否是直角三角形

根据文本提示分别输入第一第二第三条三角形的边长&#xff0c;程序会根据勾股定理计算是否是直角三角形&#xff0c;如果是直角三角形&#xff0c;会显示该三角形是直角三角形&#xff0c;如果不是直角三角形则显示该三角形不是直角三角形。 结果演示 代码演示 package com.…

【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较 5. 区域分割之聚类方法 5.3 SLIC 超像素区域分割 SLIC 基于网格化 K-means 聚类方法&#xff0c;原理简单&#xff0c;计算复杂度为O(N)&#xff0c;N 为像素点个数。 S…

python程序的name属性作用是什么_python __name__ == ‘__main__’详细解释+例子

学习过C语言或者Java语言的盆友应该都知道程序运行必然有主程序入口main函数&#xff0c;而python却不同&#xff0c;即便没有主程序入口&#xff0c;程序一样可以自上而下对代码块依次运行&#xff0c;然后python不少开源项目或者模块中依然存在 __name__ “__main__” 这种写…

【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割 5.4 SEEDS 超像素区域分割 超像素个体应在视觉上一致&#xff0c;特别是颜色应尽可能均匀。SLIC 使用欧几里德距离来度量像素点的相似度&#xff0c;不能反映颜色的方差。 SEED…

能否组成三角形

根据三角形三边长判断是否可以组成一个三角形&#xff0c;如果输入的不对会给出相应的提示。 结果演示 代码演示 package com.nine; import java.util.Scanner; public class ZhiJiao {public static void main(String[] args) {Scanner scan new Scanner(System.in);System…

安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...

log信息&#xff1a;07-0801:55:43.985:ERROR/vold(27):Erroropeningswitchnamepath/sys/class/switch/test(Nosuchfileordirectory)07-0801:55:43.985:ERROR/vold(27):Errorbootstrappingswit...log信息&#xff1a;07-08 01:55:43.985: ERROR/vold(27): Error opening switch…

【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割

【OpenCV 例程200篇 总目录-202206更新】** 【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割 5.5 LSC 超像素区域分割 线性谱聚类&#xff08;Linear Spectral Clustering&#xff0c;LSC&#xff09;是 SLIC 的改进方案&#xff0c;可以生成紧凑且均匀的超像素&…

修改SqlServer的登录密码

我们每次打开SqlServer数据库的时候首先会让我们登录用户名和密码&#xff0c;那么我们如何修改之前设定的密码呢&#xff1f; 1.打开我们的SqlServer 2.点击安全性&#xff0c;选择自己登录SqlServer的账户双击看到如下页面 3.在密码和确认密码的输入框中修改我们的新密码。…

java递归栈_java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶...

import java.util.Stack;public class ReverseStackRecursive {/*** Q 66.颠倒栈。* 题目&#xff1a;用递归颠倒一个栈。例如输入栈{1,2,3,4,5}&#xff0c;1在栈顶。* 颠倒之后的栈为{5,4,3,2,1}&#xff0c;5处在栈顶。*1. Pop the top element*2. Reverse the remaining st…

Redis DeskTop Manager 使用教程

redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具。 redis desktop manager主要针对redis开发设计&#xff0c;拥有直观强大的可视化界面&#xff0c;具有完善全面的数据操作功能&#xff0c;可以针对目标key执行rename&#xff0c;delete&#xf…