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 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
随机推荐
- notepad++ quicktext插件安装与代码片段配置[quicktext v0.2.1]
1 下载quicktext插件0.2.1版本 http://sourceforge.net/projects/quicktext/ 2 解压 3 把QuickText.ANSI.dll和QuickTe ...
- 数位dp模版(dp)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- POJ 3083 Children of the Candy Corn (DFS + BFS + 模拟)
题目链接:http://poj.org/problem?id=3083 题意: 这里有一个w * h的迷宫,给你入口和出口,让你分别求以下三种情况时,到达出口的步数(总步数包括入口和出口): 第一种: ...
- Maven学习笔记3
好了,按照笔记2的方法我们创建好一个web项目(使用maven:java项目还是java项目,web项目还是web项目,唯一的变化既是我们在pom.xml中配置了我们本应该先下载然后导入的jar包,这 ...
- log4j2+slf4j+junit
dependencies: compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21' compile group: 'org.a ...
- linux基本优化
修改主机名 hostnamectl set-hostname <hostname> 修改终端命令行颜色 # vim /etc/profile 末尾添加 PS1='\[\e[31;40m\] ...
- [CF678F]Lena and Queries
题意: 初始有一个空集合$n$个操作有三种操作,如下:$1\ a\ b$表示向集合中插入二元组$(a,b)$$2\ i$表示删除第$i$次操作时所插入的二元组$3\ q$表示询问当前集合的二元组中,$ ...
- 通读《STL源码剖析》之后的一点读书笔记
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- iOS开发——使用基于Autolayout的ScrollView
问题描述: 在使用Autolayout布局方式对ScrollView进行布局时,如果你想做一个可以垂直方向滚动的九宫格类似这样: 拿一行来说,一定不要想当然的尝试去给一行图标进行均匀排列的操作(指 ...
- 一道综合练习题实践list及dictionary集合类
定义一个员工的集合,对员工集合内的元素进行查询和删除.实现员工的签到和签退,要求如下: //A:每天只能签到一次 //B:签退前必须已经签到 //C:显示打卡记录 代码如下:员工信息类: using ...