【转载】Python线程、进程和协程详解
从操作系统角度
操作系统处理任务,调度单位是进程和线程。
进程:表示一个程序的执行活动(打开程序、读写程序数据、关闭程序)
线程:执行某个程序时,该进程调度的最小执行单位(执行功能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线程、进程和协程详解相关推荐
- python协程详解
目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...
- python协程详解_python协程详解
原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...
- Python进程、线程、协程详解
进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...
- python 协程详解教程
一.协程的概念 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. cpu正在运行一个任务,会 ...
- Python 协程详解
目录 什么是协程 Python 对协程的支持经历了多个版本: 一.协程实现方法: 1.greenlet,早期模块 2.yield关键字(Python2.x开始) 3.asyncio装饰器(Python ...
- coroutine协程详解
前两天阿里巴巴开源了coobjc,没几天就已经2千多star了,我也看了看源码,主要关注的是协程的实现,周末折腾了两整天参照Go的前身libtask和风神的coroutine实现了一部分,也看了一些文 ...
- 线程和协程详解-python
1.前言 关于基本概念部分这里不再详述,可以参考之前的文章或者自行查阅相关文章. 由于python中线程的创建.属性和方法和进程很相似,这里也不再讲解. 这里重点讲解下多线程访问共享数据的相关问题. ...
- python协程详解_对Python协程之异步同步的区别详解
一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...
- python多核cpu_Python中的多核CPU共享数据之协程详解
一 : 科普一分钟 尽管进程间是独立存在的,不能相互访问彼此的数据,但是在python中却存在进程间的通信方法,来帮助我们可以利用多核CPU也能共享数据. 对于多线程其实也是存在一些缺点的,不是任何场 ...
最新文章
- 区块链技术的标准化和颠覆性
- 一帖搞定U盘系统制作及安装苹果mac os引导U盘安装windows7
- 几个常见规则引擎的简单介绍和演示
- Docker cgroups作用(十)
- html制作主体部分,html – 使用CSS制作具有动态面板主体高度的面板填充父容器高度的其余部分...
- 不好意思,我真的不知道MySQL的窗口函数...
- C语言左移位符号 << 结合 |= 实现置位操作
- oracle开放查询表权限_oracle 查询当前用户的表和其他用户的表
- 丢失__EVENTTARGET _dopost Asp.net自带隐藏域和脚本的现象
- 漫步微积分一 —— 引言
- navicat连接mysql报错ssh_Navicat 连接SSH方式连接mysql报错 ssh:expected key exchange group packet...
- VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
- 多模态 | 从顶会论文看多模态预训练研究进展
- struts教程笔记3
- 二级vb计算机考试试题,全国计算机vb二级考试真题
- Nacos 原理 Jraft Distro Grpc 持续跟新中...
- Android 复杂的列表视图新写法 MultiType
- 初次使用Vscode,遇到了一个极具没有水平的问题,解决之后瞬间感到无比尴尬
- Introductory Combinatorics 5th Solutions Chapter1 1~6
- 虚拟专用网和IPv6路由配置【Cisco】
热门文章
- linux spf13 vim安装,Linux 下安装 spf13-VIM
- [ESC] EnTT 学习记录 1
- [电工] 比较电路、反向滞回电路,正向滞回电路预习题
- docker 使用技巧
- 解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
- phpcmsV9-本地项目上线 - 踩坑篇
- discuz二次元文章博客模板
- 天人短文网站系统v5.53源码
- ios退款 怎么定位到是哪个用户_哪个浏览器兼容性最好用?看看用户都是怎么评价的吧...
- git head指向老版本_Git最全总结