从操作系统角度

操作系统处理任务,调度单位是进程线程

进程:表示一个程序的执行活动(打开程序、读写程序数据、关闭程序)
线程:执行某个程序时,该进程调度的最小执行单位(执行功能1,执行功能2)

一个程序至少有一个进程,一个进程至少有一个线程。

并行
需要处理的任务数 == CPU核心数量

两个任务,两个核心

任务1:-------------
任务2:-------------

并发
需要处理的任务数 > CPU核心数量

三个任务,一个核心
任务1: ----- ------
任务2: ------
任务3: ------


从程序角度

多进程、多线程
表示当前程序可以同时执行多个任务

进程和线程都是由操作系统调度完成。

进程:

  • 每个进程都有自己独立的内存空间,不同进程之间的内存空间不能共享。
  • 不同进程之间的通信由操作系统完成。
  • 不同进程之间的通信效率低下,切换开销大。

线程:

  • 一个进程下可以有多个线程,同一个进程内的线程可以共享内存空间.
  • 不同线程之间的通信有进程管理。
  • 不同线程之间的通信效率高,切换开销小。

互斥锁:

共享意味着多个线程的竞争,会导致不安全问题。
为了保护内存空间的数据不被多个线程同时读写,导致数据隐患,于是诞生了"互斥锁"。

"互斥锁":一种安全有序的让多个线程访问进程内存空间的机制。
当一个线程在访问进程内存空间时,互斥锁可以防止其他线程访问

解释型语言:执行程序时,解释器按行执行程序内容,执行时检查问题。
编译型语言:通过编译器将程序编译为一个可执行文件,执行前检查问题。

Python中的多线程:

GIL(全局解释器锁):同一时刻只能有一个线程在运行。

坏处:多线程不能充分利用多核CPU资源。
好处:从根本上杜绝了多线程访问内存空间的安全问题。

Python的多线程不适合并行,但非常适合并发。

Python的多线程在遇到 IO阻塞函数执行,会自动释放GIL,让后面的线程执行任务。
如果没有 IO 操作,那么解释器会每隔100次操作后,强制释放GIL,让后面的线程执行。
import sys
sys.getcheckinterval()

多进程:

适用于密集CPU任务,可以充分调度CPU资源(大量的并行运算)。
multiprocessing

缺点:不适用于需要大量数据通信和多次切换的场景,因为进程之间通信和切换成本高。

多线程:

适用于密集IO任务(网络IO,磁盘IO,数据库IO),在IO阻塞时可以切换线程执行。
threading.Thread、multiprocessing.dummy

缺点:同一个CPU时间片只能执行一个任务,不能做到并行,只能做到并发。
优点:线程之间切换和通信非常方便,开销小。

协程:

由程序员自行编写调度功能,切换协程就好比切换一个函数,几乎没有切换开销。
特点是在单线程上执行多个任务,调度由程序员控制,不经过操作系统,所以没有进程线程的切换开销,也不需要处理锁。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时。协程,则只使用一个线程,分解一个线程成为多个“微线程”,在一个线程中规定某个代码块的执行顺序。
协程的适用场景:当程序中存在大量不需要CPU的操作时(IO)。
gevent
monkey.patch_all()

monkey的作用是将Python底层的网络库socket、select自动打个补丁,程序在遇到网络IO阻塞时,可以自动切换协程工作。(该补丁不适用于本地IO)

优点:协程任务是基于用户的,不经过操作系统,执行效率极高。
缺点:单线程执行,不能处理CPU密集任务,和密集本地IO任务。

【转载】Python线程、进程和协程详解相关推荐

  1. python协程详解

    目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...

  2. python协程详解_python协程详解

    原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...

  3. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  4. python 协程详解教程

    一.协程的概念 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. cpu正在运行一个任务,会 ...

  5. Python 协程详解

    目录 什么是协程 Python 对协程的支持经历了多个版本: 一.协程实现方法: 1.greenlet,早期模块 2.yield关键字(Python2.x开始) 3.asyncio装饰器(Python ...

  6. coroutine协程详解

    前两天阿里巴巴开源了coobjc,没几天就已经2千多star了,我也看了看源码,主要关注的是协程的实现,周末折腾了两整天参照Go的前身libtask和风神的coroutine实现了一部分,也看了一些文 ...

  7. 线程和协程详解-python

    1.前言 关于基本概念部分这里不再详述,可以参考之前的文章或者自行查阅相关文章. 由于python中线程的创建.属性和方法和进程很相似,这里也不再讲解. 这里重点讲解下多线程访问共享数据的相关问题. ...

  8. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  9. python多核cpu_Python中的多核CPU共享数据之协程详解

    一 : 科普一分钟 尽管进程间是独立存在的,不能相互访问彼此的数据,但是在python中却存在进程间的通信方法,来帮助我们可以利用多核CPU也能共享数据. 对于多线程其实也是存在一些缺点的,不是任何场 ...

最新文章

  1. 区块链技术的标准化和颠覆性
  2. 一帖搞定U盘系统制作及安装苹果mac os引导U盘安装windows7
  3. 几个常见规则引擎的简单介绍和演示
  4. Docker cgroups作用(十)
  5. html制作主体部分,html – 使用CSS制作具有动态面板主体高度的面板填充父容器高度的其余部分...
  6. 不好意思,我真的不知道MySQL的窗口函数...
  7. C语言左移位符号 << 结合 |= 实现置位操作
  8. oracle开放查询表权限_oracle 查询当前用户的表和其他用户的表
  9. 丢失__EVENTTARGET _dopost Asp.net自带隐藏域和脚本的现象
  10. 漫步微积分一 —— 引言
  11. navicat连接mysql报错ssh_Navicat 连接SSH方式连接mysql报错 ssh:expected key exchange group packet...
  12. VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
  13. 多模态 | 从顶会论文看多模态预训练研究进展
  14. struts教程笔记3
  15. 二级vb计算机考试试题,全国计算机vb二级考试真题
  16. Nacos 原理 Jraft Distro Grpc 持续跟新中...
  17. Android 复杂的列表视图新写法 MultiType
  18. 初次使用Vscode,遇到了一个极具没有水平的问题,解决之后瞬间感到无比尴尬
  19. Introductory Combinatorics 5th Solutions Chapter1 1~6
  20. 虚拟专用网和IPv6路由配置【Cisco】

热门文章

  1. linux spf13 vim安装,Linux 下安装 spf13-VIM
  2. [ESC] EnTT 学习记录 1
  3. [电工] 比较电路、反向滞回电路,正向滞回电路预习题
  4. docker 使用技巧
  5. 解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
  6. phpcmsV9-本地项目上线 - 踩坑篇
  7. discuz二次元文章博客模板
  8. 天人短文网站系统v5.53源码
  9. ios退款 怎么定位到是哪个用户_哪个浏览器兼容性最好用?看看用户都是怎么评价的吧...
  10. git head指向老版本_Git最全总结