加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

数据中心很费电!

发布时间:2021-02-17 15:55:50 所属栏目:外闻 来源:互联网
导读:面,将针对在不同的应用场景中如何选择使用Python中的进程,线程,协程进行分析。 如何选择? 在针对不同的场景对比三者的区别之前,首先需要介绍一下python的多线程(一直被程序员所诟病,认为是假的多线程)。 那为什么认为Python中的多线程是伪多线程呢? 更

面,将针对在不同的应用场景中如何选择使用Python中的进程,线程,协程进行分析。

如何选择?

在针对不同的场景对比三者的区别之前,首先需要介绍一下python的多线程(一直被程序员所诟病,认为是"假的"多线程)。

那为什么认为Python中的多线程是“伪”多线程呢?

更换上面multiprocessing示例中, p=multiprocessing.Process(target=count,args=(i,))为 p=threading.Thread(target=count,args=(i,)),其他照旧,运行结果如下:

为了减少代码冗余和文章篇幅,命名和打印不规则问题请忽略

 

系统利用PCB来完成对进程的控制和管理。同样,系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中,TCB中通常包括:

  • 线程标志符
  • 一组寄存器
  • 线程运行状态
  • 优先级
  • 线程专有存储区
  • 信号屏蔽

和进程一样,线程同样有五种状态:初始态、执行状态、等待(阻塞)状态、就绪状态和终止状态,线程之间的切换和进程一样也需要上下文切换,这里不再赘述。

进程和线程之间有许多相似的地方,那它们之间到底有什么区别呢?

进程 VS 线程

  • 进程是资源的分配和调度的独立单元。进程拥有完整的虚拟地址空间,当发生进程切换时,不同的进程拥有不同的虚拟地址空间。而同一进程的多个线程是可以共享同一地址空间
  • 线程是CPU调度的基本单元,一个进程包含若干线程。
  • 线程比进程小,基本上不拥有系统资源。线程的创建和销毁所需要的时间比进程小很多
  • 由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作
  • 一个线程的意外终止会影像整个进程的正常运行,但是一个进程的意外终止不会影像其他的进程的运行。因此,多进程程序安全性更高。

总之,多进程程序安全性高,进程切换开销大,效率低;多线程程序维护成本高,线程切换开销小,效率高。(python的多线程是伪多线程,下文中将详细介绍)

什么是协程

协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制。协程与线程以及进程的关系见下图所示。

  • 协程可以比作子程序,但执行过程中,子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。协程之间的切换不需要涉及任何系统调用或任何阻塞调用
  • 协程只在一个线程中执行,是子程序之间的切换,发生在用户态上。而且,线程的阻塞状态是由操作系统内核来完成,发生在内核态上,因此协程相比线程节省线程创建和切换的开销
  • 协程中不存在同时写变量冲突,因此,也就不需要用来守卫关键区块的同步性原语,比如互斥锁、信号量等,并且不需要来自操作系统的支持。

协程适用于IO阻塞且需要大量并发的场景,当发生IO阻塞,由协程的调度器进行调度,通过将数据流yield掉,并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去运行。


(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读