并发编程4
Posted linchengcheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程4相关的知识,希望对你有一定的参考价值。
1 GIL
GIL是一个全局解释器锁,是一种互斥锁
一个python.exe进程中只有一份解释器,如果职工进程开启了多个线程都要执行代码
多线程之间要竞争解释器,一旦竞争就会出现问题
GIL带来的问题是同一时间只有一个线程可以访问解释器
好处是保证了多线程的数据安全
thread-safe 线程安全,多个线程同时访问也不会出现问题
not thread-safe 非线程安全,多个线程同时访问可能出现问题
GC垃圾回收
默认情况下一个进程只有一个线程,是不会出现问题的,但是不要忘记还有GC线程一旦出现多个线程就可能出现问题,所以当初就简单粗暴的加上了GIL锁
由于有GIL的存在即使有多个CPU也不可能真正的并行
应用程序分为两种
IO密集型 IO操作较多,纯计算较少 采用多线程
计算密集型 计算曹军较多,IO操作较少 采用多进程
当多线程需要共享一个不属于解释器的资源时,必须要自己加锁
2 线程池,进程池
池是一种容器
服务器不可能无限的开线程,所以需要对线程数量加以控制,线程池就是帮我们封装了线程数量的控制,以及线程的创建,销毁,任务分配
进程池与线程池相同
特点:
线程池在创建时不会立即开启线程
等到提交任务时,如果没有空闲线程并且已存在的线程数量小于最大值时,会新开一条线程
线程池中的线程开启后就不会关闭了,直到进程全部结束
3 同步 异步 阻塞 非阻塞
阻塞:程序运行过程中遇到IO操作,无法继续运行
非阻塞:程序正在运行中并且没有遇到IO操作,即使遇到IO也不会阻塞,CPU不会切走
阻塞,非阻塞指的是程序的执行状态
同步,异步指的是发起任务的方式
同步:在发起任务后必须在原地等待,任务执行完毕才能继续往下执行
异步:在发起任务后立即继续往下执行,不需要等待任务的执行结果
异步效率高于同步
发起异步任务的方式就是线程和进程
同步和阻塞时完全不同的:
阻塞一定是CPU已经切走了
同步虽然会卡住,但是CPU没有切走还在你的进程中
以上是关于并发编程4的主要内容,如果未能解决你的问题,请参考以下文章