设为首页 收藏本站
查看: 1481|回复: 0

[经验分享] python 多进程、多线程、协程

[复制链接]

尚未签到

发表于 2018-8-16 06:05:17 | 显示全部楼层 |阅读模式
  多进程,多线程编程
  进程和线程有很多类似的性质,他们都可以被CPU作为一个单元进行调度,它们都拥有自己独立的栈(Stack)等等。因此线程也被称作LWP(Lightweight Process 轻量级进程);对应的进程也可以被称为HWP(Heavyweight Process 重量级进程),从线程的角度看,进程就是只有一个线程的进程。如果一个进程有多个线程,那么他就能 同时执行多个任务了。它们的异同可以从以下多个角度来论述:
  调度
  在传统的计算机操作系统中,CPU的基本调度单位是进程,后来操作系统普遍引入了线程的概念,线程成为了CPU调度的基本单位,进程只能作为资源拥有的基本单位。
  并行
  由于线程的引入,原先进程只能有一个并发,现在一个进程可以有多个线程并行执行。早期很多HTTP server都是通过线程来解决服务器的并发,比起之前用fork子进程来处理并发效率有了数倍的提升。这一切都是益于线程可以用进程更低的代价实现并发。
  共享
  一般来说Linux线程会继承或共享如下资源:







        •   进程代码段,如下图作示



   DSC0000.png







        •   进程的共有数据段内存(利用这些共享的数据,县城很容易实现相互之间的通讯)
        •   进程打开的FD(File Descriptor,文件描述符)
        •   信号的处理器
        •   进程用户ID(UID)与进程组ID(PGID)



  隔离
  
  linux的线程会独立有如下资源(非共享)







        •   线程ID,在linux中线程和进程共享ID空间,在UNIX系统中线程的ID是和进程ID不同层面的概念
        •   寄存器的值,这其实就是线程能作为独立调度单元的最必要的保证
        •   线程的栈,这是线程能并行运行的保证
        •   优先级,Linux的系统设计使得线程和进程除了在某些资源的共享&隔离有差异之外,几乎是一视同仁的,所以他们可以有不用的priority



  协程简介
  精辟的说,协程就是用户自己在进程中控制多任务的栈,尽可能的不让进程由于外部中断或者IO的等待丧失CPU调度的时间片,从而在进程内部实现并发。
  为了缓解,处理高并发的连接Linux在很早的时候就引入了协程,来缓解上下文切换造成 的性能损失,在某种程度上实现异步编程。但由于协程的编程太过于晦涩难懂,所以即便是 协程在线程之前更早的被引入Linux内核,也始终没有流行起来。
  下面是wikipedia对于协程的一段描述,大家可以参考一下:
  到2003年,很多最流行的编程语言,包括C和他的后继,都未在语言内或其标准库中直接支持协程。(这在很大程度上是受基于堆栈的子例程实现的限制)。
  有些情况下,使用协程的实现策略显得很自然,但是此环境下却不能使用协程。典型的解决方法是创建一个子例程,它用布尔标志的集合以及其他状态变量在调用之间维护内部状态。代码中基于这些状态变量的值的条件语句产生出不同的执行路径及后继的函数调用。另一种典型的解决方案是用一个庞大而复杂的switch语句实现一个显式状态机。这种实现理解和维护起来都很困难。
  在当今的主流编程环境里,线程是协程的合适的替代者,线程提供了用来管理“同时”执行的代码段实时交互的功能。因为要解决大量困难的问题,线程包括了许多强大和复杂的功能并导致了困难的学习曲线。当需要的只是一个协程时,使用线程就过于技巧了。然而——不像其他的替代者——在支持C的环境中,线程也是广泛有效的,对很多程序员也比较熟悉,并被很好地实现,文档化和支持。在POSIX里有一个标准的良定义的线程实现pthread.
  但近些年来,golang的努力,似乎又让这个古老的机制有了复苏的迹象。
  多进程和多线程的选用场景
  在linux系统编程中,多进程和多线程都有自己的用武之地。
  多数情况它们的选用是按照它们的特性,其中最重要的特性就是上面提过的“共享”、“隔离”。
  我们举个例子:
  我们所熟知的memcached,是个典型的多线程编程、之所以它是多线程和而不是多进程,  主要的一个原因在于,memcached的多个进程需要共享内存中的Key-Value数据,所以多线程是一个必然的选择。
  然后就是大名鼎鼎的Nginx,是个典型的多进程编程。由于Nginx所要处理的HTTP请求都是 比较独立的,没有太多需要共享的数据。更重要的是Nginx需要支持“不停服务重启server”这一特 性这个功能也是这能在多进程框架下才能实现的。
  所以,一个结论就是:到底是多进程好,还是多线程需要根据业务场景来分析选择。
  作者:auxten
  链接:https://zhuanlan.zhihu.com/p/20167077
  来源:知乎
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-552326-1-1.html 上篇帖子: python之netifaces模块 下篇帖子: 使用python收集IP信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表