龙空技术网

python并发编程或许你该先理解下多线程与协程

编码大棚 525

前言:

现在兄弟们对“python线程与协程”大约比较珍视,姐妹们都需要剖析一些“python线程与协程”的相关知识。那么小编也在网络上汇集了一些对于“python线程与协程””的相关资讯,希望看官们能喜欢,各位老铁们一起来了解一下吧!

在程序员厌倦了进程、线程这种重量级的并发实体之后,大家都通常都会转移到一个叫做协程的东西上, 将它作为我们高并发的最后一根稻草, 我们来简单的聊一聊协程和线程的一些事情

依赖于线程的并发

程序员大多都写过一些多线程的东西, 再加上编程语言现在封装的一些线程池,如果一个程序只是使用,可能关注的东西已经足够的少了

我们的程序通常都会访问一些具体的资源,当访问资源的时候,就会让我们从用户态,穿越到内核态,然后让CPU从内存、L3、L2、L1中开始一步步加载接下来需要的数据,同时将之前的数据保存起来

线程的问题

在线程的调度中,主要是依赖于操作系统的调度, 大家都知道不能一度的无限开线程, 其实主要有三个方法方面:

线程本身就有资源消耗, 比如有些业务线程,可能有几十M的内存占用, 哪你算一下,除去给操作系统保留的内存,剩下的内存能够开多少呢

调度增加,时间片减少, 一个线程加入操作系统,操作系统必须把新加入的线程加入到当前的调度分配中, 虽然后续可能会根据一些调度策略来进行优化,但你这个线程存在,操作系统就要考虑进去

因为线程增多,但CPU的频率就那么快,比如原本我就100个线程,操作系统将时间分配给这100份就可以了,但你10000个,就要分10000份,你虽然很小,但是操作系统也不能让你饿死, 但你又不会真的忙,反而导致,操作系统为了运行你,就要把真正在干活的线程给切换出去, 而你却是真不忙

协程

我们只关注上半部分就可以了, 在我们用户线程里面运行的不再直接 是用户逻辑,而是一个调度器

调度器负责将我们用户用协程编写的业务逻辑来运行调度,这样以来,我们就不再需要让操作系统调度那么多线程了, 由我们这个调度器去调度

我们先说协程, 协程由两部分组成,一个是具体的代码逻辑(通过代码地址引用)和所依赖的资源信息, 比如从用户侧来说需要保存变量和所用到的数据,从系统层来说,它需要保存调用时的寄存器信息,以便后续恢复执行时使用, 是不是有点类似我们常说的闭包?

调度器通常在用户声明的一个协程的时候,会在用户逻辑执行的过程中,去插入一些调度指令,为什么要这些调度指令呢?其实就是为了能够控制协程的切换,否则一个协程泡起来,如果一直不退出,那其他协程岂不是饿死了

我们插入了调度指令,我们也为协程分配好了执行所需要的资源,那剩下的事就是调度器的调度了,其实就是我们说的转移, 转移其实同操作系统的调度差不多,将当前协程的上下文信息,进行保存,然后执行心的协程,加载执行

好了就写到这吧,欢迎各位pythoner兄弟一起交流分享学习Python的心得, 大家可以关注下本号,动动小手转发分享,鼓励我继续写下去!

标签: #python线程与协程 #python协程和多线程