python多线程好还是多协程好_python 多进程、多线程、协程

多进程,多线程编程

进程和线程有很多类似的性质,他们都可以被CPU作为一个单元进行调度,它们都拥有自己独立的栈(Stack)等等。因此线程也被称作LWP(Lightweight Process 轻量级进程);对应的进程也可以被称为HWP(Heavyweight Process 重量级进程),从线程的角度看,进程就是只有一个线程的进程。如果一个进程有多个线程,那么他就能 同时执行多个任务了。它们的异同可以从以下多个角度来论述:

调度

在传统的计算机操作系统中,CPU的基本调度单位是进程,后来操作系统普遍引入了线程的概念,线程成为了CPU调度的基本单位,进程只能作为资源拥有的基本单位。

并行

由于线程的引入,原先进程只能有一个并发,现在一个进程可以有多个线程并行执行。早期很多HTTP server都是通过线程来解决服务器的并发,比起之前用fork子进程来处理并发效率有了数倍的提升。这一切都是益于线程可以用进程更低的代价实现并发。

共享

一般来说Linux线程会继承或共享如下资源:进程代码段,如下图作示

wKioL1hg_DSBuVnIAAINg1BCrJ8679.png-wh_500x0-wm_3-wmp_4-s_3544091456.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

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值