多进程(multi_processes),多线程(multi_threaded),并发与并行
多进程:
就是多任务同时运行,比如人可以三心二意一样,他的实现机制就是并发。但是计算机cpu实际上在一个时间点只能执行一个任务,因此并发可以理解为时间轮转调度运行方式,即按次序不断切换执行多个任务,但是每次切换都很快,感觉不到任务的暂停。实际上还是一心一意。每个进程至少含有一个线程。
多线程:线程是进程的细分,多线程是指一个进程(任务)又可以分成他不用的部分来执行。
cpu又分为单核心和多核心。每个核心只能执行一个线程。
并行:多进程(多任务)同时运行,真正的同时多任务。只有多核cpu线程可以并行,多cpu进程可以并行。
并发:单CPU单核中线程只能并发,进程也只能并发。
无论是并发还是并行,使用者看到的都是多进程,多线程。
首先,将系统的线程和cpu的线程分开,我们说cpu是4核8线程(这里指cpu最多可以同时运行8条指令集bytecode)
因此,多进程(每个进程只有一个线程)就是大家(线程)不在一个桌子上干活(每个桌子都有一份完整的材料--内存占用大); 多线程就是在一个桌子干活,材料都是共享的
线程是操作系统直接支持的最小执行单元.
任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程(子线程),Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。
python每个进程有一个全局锁,因此不管这个进程下是几个线程,都只能同时存在一个在执行的线程.
当然,多进程是可以真正实现多线程,因为此时由多个解释器,每个解释器一个GIL.
master-workers机制:master就是多线程的主线程,主要是分配任务,而workers为其他子线程.
IO任务:从硬盘或者网口等读写任务(除cpu和主存外的那些更慢的读写任务)
因此对于IO任务来说:python的多线程还凑乎.(python本身就是---真正运行起来时为单核单线程,核心再多也白瞎)
对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。
如果某线程并未使用很多I/O操作,它会在自己的时间片内一直占用处理器和GIL。也就是说,I/O密集型的Python程序比计算密集型的Python程序更能充分利用多线程的好处。
python的多线程的queue是线程安全的!----即比如.put操作,如果消息队列中暂时是满的,则.put会暂时被阻塞.
Python多进程和多线程哪个快?
- 对CPU密集型代码(比如循环计算) - 多进程效率更高
- 对IO密集型代码(比如文件操作,网络爬虫) - 多线程效率更高。
为什么是这样呢?其实也不难理解。
对于IO密集型操作,大部分消耗时间其实是等待时间,在等待时间中CPU是不需要工作的,
那你在此期间提供双CPU资源也是利用不上的,相反对于CPU密集型代码,2个CPU干活肯定比一个CPU快很多。
那么为什么多线程会对IO密集型代码有用呢?这时因为python碰到IO等待会释放GIL供新的线程使用,实现了线程间的切换。
但是python3中对于IO有了更好的协程来解决.
https://www.cnblogs.com/zhangchaocoming/p/12583639.html
https://blog.csdn.net/zhengyshan/article/details/80641770
https://cloud.tencent.com/developer/article/1193691
https://www.cnblogs.com/klb561/p/10759477.html