一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。

1.进程: 表示一个程序的执行活动 (打开程序、读写程序数据、关闭程序)

2.线程: 执行某个程序时, 该进程调度的最小执行单位 (执行功能1,执行功能2) 一个程序至少有一个进程 一个进程至少有一个线程

1.并行: 需要处理的任务数 == CPU核心数量 两个任务 两个核心 任务1:------------- 任务2:-------------

2.并发: 需要处理的任务数 > CPU核心数量 三个任务 一个核心 任务1: ----- ------ 任务2: ------ 任务3: ------

二、从程序角度 多进程和多线程 表示:当前程序可以同时执行多个任务 进程和线程都是由 操作系统调度完成

1.进程:

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

2.线程:

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

3.互斥锁:

共享意味着多个线程的竞争 会导致不安全问题。 为了保护内存空间的数据不被多个线程同时读写, 导致数据隐患, 于是诞生了" 互斥锁 "。 "互斥锁": 一种安全有序的让多个线程访问进程内存空间的机制。 当一个线程在访问进程内存空间时, 互斥锁可以防止其他线程访问 解释型语言:执行程序时,解释器按行执行程序内容,执行时检查问题。 编译型语言:通过编译器将程序编译为一个可执行文件,执行前检查问题。

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

坏处: 多线程不能充分利用多核CPU资源。

好处: 从根本上杜绝了多线程访问内存空间的安全问题。Python的多线程不适合并行, 但非常适合并发。 Python的多线程在遇到 IO阻塞函数执行, 会自动释放GIL, 让后面的线程执行任务。 如果没有 IO 操作, 那么解释器会每隔100次操作后, 强制释放GIL,让后面的线程执行。 import sys sys.getcheckinterval()

1.多进程:

适用于密集CPU任务, 可以充分调度CPU资源(大量的并行运算)。 multiprocessing 缺点:不适用于需要大量数据通信和多次切换的场景,因为进程之间通信和切换成本高。

2.多线程:

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

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

3.协程:

由程序员自行编写调度功能, 切换协程就好比切换一个函数, 几乎没有切换开销。

特点是在单线程上执行多个任务, 调度由程序员控制,不经过操作系统, 所以没有进程线程的切换开销, 也不需要处理锁。

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

(该补丁不适用于本地IO)

优点:协程任务是基于用户的,不经过操作系统,执行效率极高。

缺点:单线程执行,不能处理 CPU密集任务,和密集本地IO任务。

python 协程、进程、线程_Python进程、线程、协程之间的关系相关推荐

  1. python 协程是啥_python中的协程

    协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为它自带 ...

  2. python3 协程 返回值_python asyncio 获取协程返回值和使用callback

    1. 获取协程返回值,实质就是future中的task import asyncio import time async def get_html(url): print("start ge ...

  3. 协程简史,一文讲清楚协程的起源、发展和实现

    /   今日科技快讯   / 北京时间10月5日下午,在瑞典首都斯德哥尔摩,瑞典皇家科学院宣布,将2022年诺贝尔化学奖授予美国化学家卡罗琳·贝尔托西.丹麦化学家摩顿·梅尔达尔和美国化学家卡尔·巴里· ...

  4. python 协程池gevent.pool_进程池\线程池,协程,gevent

    目录 1. 进程池与线程池 2. 协程 3. gevent 4. 单线程下实现并发的套接字通信 首先写一个基于多线程的套接字 服务端: from socket import * from thread ...

  5. python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...

    一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...

  6. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

  7. linux的进程/线程/协程系列1:进程到协程的演化

    linux的进程/线程/协程系列1:进程到协程的演化 前言 摘要: 1. 一些历史:批处理时代 2. 现代操作系统启动过程 3. 进程(process)的出现 4. 线程(thread)与线程池 5. ...

  8. python中协程的理解_python协程的理解

    一.介绍 什么是并发? 并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 1.任务发生阻塞 2.计算任务时间过长,需要让出cpu给高 ...

  9. python协程详解_python协程详解

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

  10. python 协程是啥_Python协程

    最近对Python中的协程挺感兴趣,这里记录对协程的个人理解. 要理解协程,首先需要知道生成器是什么.生成器其实就是不断产出值的函数,只不过在函数中需要使用yield这一个关键词将值产出.下面来看一个 ...

最新文章

  1. oracle存储过程的常用语法
  2. 如何低价坐飞机头等舱
  3. PHP问题 —— Warning: PHP Startup: Unable to load dyna
  4. 全年月平均工作时间和工资折算办法
  5. rust怎么进入好友的房间_Rust基础知识-模块系统(上)
  6. 抓取从源地址为10.0.0.111主机访问目标主机10.0.0.222的80/tcp端口的流量?
  7. JVM系列之:对象的锁状态和同步
  8. python图片显示英文字符_python如何解析字符串中出现的英文人名?
  9. Android 功耗优化(1)----使用Battery Historian生成电量消耗报告
  10. Maven STS创建WEB项目
  11. 16 岁赚到 20 万美元,我的编程之路始于对代码的热爱
  12. PHP excel模板
  13. python如何爬有道翻译_python爬取有道翻译
  14. 怎么打开Win10系统的文件夹选项?
  15. 想要改变客户态度 这些销售话术需掌握
  16. 以“基”取胜:青立方超融合易捷版,助力企业“极简”上云
  17. 特斯拉降维打击 国产电动车怎么“盘”?
  18. oracle中的双精度浮点,双精度扩展格式 (x86)
  19. java二进制计算_Java 二进制,八进制,十进制,十六进制转换运算
  20. 神经性脚臭案例整理(一)

热门文章

  1. Spring Boot 的2020最后一击:2.4.1、2.3.7、2.2.12 发布
  2. 面试必问:怎么保证缓存与数据库的双写一致性?
  3. java数据通道抽象为流_【java】IO流
  4. oracle 数据库里查看表空间使用状况
  5. Jetson Xavier(Ubuntu18.04)安装固态硬盘并挂载到/home区下
  6. Paddle Detection
  7. 卷积神经网络的“封神之路
  8. torch bceloss nan
  9. libreadline.so.6: undefined symbol
  10. python 调用c++返回char*