线程、进程和协成对比

讲述线程、进程和协成?

1)为什么引入:

操作系统可以同时运行多个任务,引入了线程,进程和协成

2)定义:

线程: 可以理解成执行代码的分支,线程是执行对应的代码的,cpu会调度对应的线程去工作,也可以说线程是cpu调度的基本单位(工作原理)
进程: 通俗理解一个运行起来的程序或者软件叫做进程
如何理解进程:把进程想成现实生活中的公司,公司可以给员工提供办公资源(办公桌椅,办公电脑等资源), 真正干活的是员工,所以员工可以想成线程,公司就是进程

协成:又称为微线程,也称为用户级线程,在不开辟线程的基础上完成多任务,在def里面只看到一个yield关键字可以理解程是协程(理解), 在单线程的基础上可以完成多任务,多个任务按照一定顺序交替执行(目的)

3)使用:

进程、线程和协成的使用对比
2.1 线程是cpu调度的基本单位,通过线程去执行进程中代码, 线程是执行代码的分支
2.2 进程是操作系统资源分配的基本单位,每启动一个进程都需要向操作系统索要运行资源,默认一个进程只有一个线程,线程是依附在进程里面的
2.3 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大
2.4 多进程开发某个进程死了不会影响其它进程的运行,但是多线程开发该进程死了那么这些线程都要进行销毁
2.5 进程之间不共享全局变量,线程之间共享全局变量,但是线程要注意资源竞争的问题
线程之间共享全局变量:
同步就是协同步调,按预定的先后次序进行运行线程同步可以解决共享全局变量的问题
从而引入了互斥锁,互斥锁确保了某段关键代码只能由一个线程从头到尾完整地执行,在使用过程中要避免出现死锁
进程之间不共享全局变量:
多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类
2.6 先有进程,然后进程可以创建线程,线程是依附在进程里面的,线程里面可以包含多个协程
2.7 多线程开发线程之间执行是无序的,协程之间执行按照一定顺序交替执行
2.8 协程以后主要用在网络爬虫和网络请求,开辟一个协程大概需要5k空间,开辟一个线程需要512k空间, 开辟一个进程占用资源最多

附录:

对于线程的使用
1.线程之间执行是无序(对比中已包含)

2.主线程会等待所有的子线程执行完成以后程序再退出,daemon=True 表示守护主线程,主线程退出子线程直接销毁不再执行对应的代码

3.多线程共享全局变量(对比中已包含)
4.互斥锁: 能保证同一时刻只有一个线程去执行代码,具体那个线程抢到锁我们决定不了,但是加上互斥锁多任务瞬间变成单任务变成单任务性能会下降(对比中已包含)

5.死锁:一直等待对方释放锁的情景就叫做死锁,工作中避免死锁的出现,要在适当的地方释放锁(对比中已包含)

对于进程的使用:
1.多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类(对比中已包含)

2.向队列里面放入数据统一put方法,获取数据的使用同一使用get方法

3.主进程会等待所有的子进程执行完成以后程序再退出,设置守护主进程,主进程退出后子进程直接销毁 sub_process.daemon = True
主进程退出之前先让子进程直接销毁,然后主进程就可以退出了:sub_process.terminate()

通过进程池完成对应的任务
同步执行:一个任务执行完成另外一个任务才能执行 pool.apply(copy_work) 资源竞争时使用
使用异步方式用进程池执行对应的任务:pool.apply_async(copy_work)

5.创建进程池中的queue时,使用异步执行对应的任务,执行异步任务会返回一个应用结果对象,这个对象里面有一个wait()方法可以等待异步任务执行完成以后代码再继续往下执行

对于协成的使用:
gevent封装是greenlet,可以根据耗时操作自动完成协程之间的切换执行

打补丁,让gevent框架识别耗时操作,比如:time.sleep,网络请求延时,monkey.patch_all()

创建协程指定对应的任务
*args: 以位置方式传参
**kwargs: 以关键字方式传参
g1 = gevent.spawn(download_img, img_url1, “1.jpg”)

主线程等待所有的协程执行完成以后程序再退出
gevent.joinall([g1, g2, g3])

更多见:https://blog.csdn.net/sinat_41912529/article/details/80306582

原文地址:https://www.cnblogs.com/Dark-fire-liehuo/p/10061721.html

时间: 2024-10-10 10:26:39

线程、进程和协成对比的相关文章

走入计算机的第三十八天(python的进程和协成))

一.进程 1.multiprocessing模块实现多进程并发. 1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程 该进程可以运行在Python程序内部编写的函数,属于父进程和子进程的关系.该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法. 1.2Process类的简绍 构造方法: Process([gro

python基础26 -----python进程及协成

一.进程 1.multiprocessing模块实现多进程并发. 1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程 该进程可以运行在Python程序内部编写的函数,属于父进程和子进程的关系.该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法. 1.2Process类的简绍 构造方法: Process([gro

python进程/线程/协成

1.谈谈对多进程多线程以及协成的理解 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫做程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大 线程:调度执行的最小单位,也叫执行路径,不能独立存在,必须依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协成:是一种用户太的轻量级线程,协成的调度完全由用户控制,协成拥有自己的寄存器上下文和栈.协成调度切换时,将寄存器上下文和

15.python并发编程(线程--进程--协程)

一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完成(2)数据集:是程序在执行过程中所需要使用的一切资源(3)进程控制块:用来记录进程外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志.3.进程的作用:是想完成多任务并发,进程之间的内存地址是相互独立的二.线程:1.定义:最小的执行单位,线程的出现是为了

py 并发编程(线程、进程、协程)

一.操作系统 操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等.操作系统的内核的定义:操作系统的内核是一个管理和控制程序,负责管理计算机的所有物理资源,其中包括:文件系统.内存管理.设备管理和进程管理 二.进程和线程 进程: 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了

Python:线程、进程与协程(1)——概念

最近的业余时间主要放在了学习Python线程.进程和协程里,第一次用python的多线程和多进程是在两个月前,当时只是简单的看了几篇博文然后就跟着用,没有仔细去研究,第一次用的感觉它们其实挺简单的,最近这段时间通过看书, 看Python 中文官方文档等等相关资料,发现并没有想想中的那么简单,很多知识点需要仔细去理解,Python线程.进程和协程应该是Python的高级用法.Python的高级用法有很多,看看Python 中文官方文档就知道了,当然有时间看看这些模块是怎么实现的对自己的提高是很有帮

Python:线程、进程与协程(3)——Queue模块及源码分析

Queue模块是提供队列操作的模块,队列是线程间最常用的交换数据的形式.该模块提供了三种队列: Queue.Queue(maxsize):先进先出,maxsize是队列的大小,其值为非正数时为无线循环队列 Queue.LifoQueue(maxsize):后进先出,相当于栈 Queue.PriorityQueue(maxsize):优先级队列. 其中LifoQueue,PriorityQueue是Queue的子类.三者拥有以下共同的方法: qsize():返回近似的队列大小.为什么要加"近似&q

线程、进程、协程和队列

一.线程.进程 1.简述 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,通俗讲就是自定义一段程序的执行过程,即一个正在运行的程序.线程是进程的基本单位,又称为轻量级进程. * 不同的进程在内存中会开辟独立的地址空间,默认进程之间的数据是不共享,线程是由进程创建,所以处在同一个进程中的所有线程都可以访问该进程所包含的地址空间,当然也包含存储在该空间中的所有资源. 应用场景: IO密集型操作由于不占用CPU资源,所以一般使用线程来完成 计算密集型操作

Python:线程、进程与协程(2)——threading模块(1)

上一篇博文介绍了Python中线程.进程与协程的基本概念,通过这几天的学习总结,下面来讲讲Python的threading模块.首先来看看threading模块有哪些方法和类吧. 主要有: Thread :线程类,这是用的最多的一个类,可以指定线程函数执行或者继承自它都可以实现子线程功能. Timer:与Thread类似,但要等待一段时间后才开始运行,是Thread的子类. Lock :原锁,是一个同步原语,当它锁住时不归某个特定的线程所有,这个可以对全局变量互斥时使用. RLock :可重入锁