Python进程、线程、协程之间的关系
一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。
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 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- python -- 进程线程协程专题
进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...
- python进程/线程/协程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- python 进程 线程 协程
并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...
- python 进程/线程/协程 测试
# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时 ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- 进程&线程&协程
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
- 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
随机推荐
- xunsearch如何按照ID排序
你ini再建一个字段id_tmp 类型type=numeric 重建索引的时候 数据源 加一个主键id的别名 id, id as id_tmp 排序的时候按照id_tmp排序
- 22、Flask实战第22天:Flask信号
Flask中的信号使用的是一个第三方插件blinker.通过pip list看一下是否安装,如果没有,则使用如下命令安装 pip install blinker 自定义信号 自定义信号分为3步: ①定 ...
- POJ 2315:Football Game(博弈论)
[题目链接] http://poj.org/problem?id=2315 [题目大意] 两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S. 每次只能踢出L以内的距离.进最后一个球 ...
- 【动态规划】Gym - 101147H - Commandos
裸dp,看代码. #include<cstdio> #include<algorithm> #include<cstring> using namespace st ...
- 【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题
∵∑gcd(i, N)(1<=i <=N) =k1*s(f1)+k2*s(k2)+...+km*s(km) {ki是N的约数,s(ki)是满足gcd(x,N)=ki(1<=x< ...
- 5.8 Properties
一.Propertie 主要用于读写资源配置文件. Properties继承自Hashtable. 我们来看下HashMap和Hashtable的区别: Hashtabl 线程安全, 同步, ...
- iOS -- 解决iOS11中navigationBar上使用initWithCustomView按钮图片错位 frame无效
在iOS11上当使用如下代码设置时 UIButton *shareButton = [UIButton buttonWithType:(UIButtonTypeCustom)]; shareButto ...
- [Android Memory] Android 的 StrictMode
android的2.3 之后引入的StrictMode 对网络的访问做了限制啊. public void onCreate() { if (DEVELOPER_MODE) { StrictMode.s ...
- JS中event.preventDefault()取消默认事件能否还原?
参考知乎讨论:https://www.zhihu.com/question/21891734
- javascript 正则表达式判断只能是中文、英文或者中文加英文
var reglx =/^[\u4e00-\u9fa5a-zA-Z]+$/ 这个是至少有一个中文或者英文 var reglx =/^[\u4e00-\u9fa5a-zA-Z]*$/ 这个是0个以上的中 ...