图片制作视频的软件/seo优化师就业前景
进程
进程是资源分配的单位,进程不会工作,可以看作进程只是向CPU申请一块资源空间
进程切换需要的资源最大,效率低
线程
线程是操作系统调度的单位,在CPU中真正工作的是线程
线程切换需要的资源一般,效率一般(除GIL)
协程
协程切换的任务资源少,效率高
多进程、多线程根据CPU核不一样可能是并行的,但是协程是在一个线程中,所以是并发
进程
multiprocessing 模块
参考代码:
https://github.com/huangsv/pythonCode/blob/main/multiprocessing_demo.py
Process 子类
参考代码:
https://github.com/huangsv/pythonCode/blob/main/process_demo.py
Pool 进程池
参考代码:https://github.com/huangsv/pythonCode/blob/main/pool_demo.py
Queue 队列实现进程间的消息通信(进程与进程间不能实现消息通信)
参考代码:https://github.com/huangsv/pythonCode/blob/main/process_queue_demo.py
线程
threading 模块
参考代码:https://github.com/huangsv/pythonCode/blob/main/threading_demo.py
Thread 子类创建线程
参考代码:https://github.com/huangsv/pythonCode/blob/main/thread_demo.py
线程间的消息通信,线程间的消息可以直接通信,但由于线程的不可控性应该使用 锁(Lock) 对数据进行线程保护
参考代码:https://github.com/huangsv/pythonCode/blob/main/lock_demo.py
线程与线程间同样可以使用 queue 队列(import queue)
参考代码:
https://github.com/huangsv/pythonCode/blob/main/thread_queue_demo.py
协程
Python 由于 GIL 锁的原因导致了多任务的整体优势低于其他如Java等,在此引入协程,目录最常用的大概是 Gevent (注意pip install gevent)
参考代码:
https://github.com/huangsv/pythonCode/blob/main/gevent_demo.py
进程 线程 协程
由于GIL,多进程能够更好的利用多核CPU,但是,多进程也有其自己的限制:相比线程更加笨重、切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL,所以一个进程只能跑满一个CPU),因为一个进程占用一个CPU时能充分利用机器的性能,但是进程多了就会出现频繁的进程切换,反而得不偿失。所以多核的情况下,考虑线程数与 CPU核心数相同的多线程,充分利用CPU的多核能力。
由于GIL,多线程同时一时刻,只有一个线程在运行,其他线程只能等待,即使是多核CPU。其执行方式为 获取GIL -> 执行代码(sleep或者程序挂起)-> 释放GIL;什么时候GIL被释放呢?当一个线程遇到 I/O 任务时,将释放GIL。计算密集型(CPU-bound)线程执行 100 次解释器的计步(ticks)时(计步可粗略看作 Python 虚拟机的指令),也会释放 GIL。
多线程对于 CPU密集型代码,如循环,计数等不太友好
多线程对 IO密集型,如文件处理,爬虫等 能够有效提升效率
协程是一种用户级的轻量线程,拥有自己的寄存器和栈,不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。而且由于抢占式调度执行顺序无法确定的特点,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题(事件驱动和异步程序也有同样的优点)。因为协程是用户自己来编写调度逻辑的,对CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。