互斥锁
互斥锁:
进程之间的数据是不共享的,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端是没有问题的,而共享带来的竞争,竞争带来的结果就是错乱,因此我们上个锁.
锁可以让多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,牺牲了速度保证了数据的安全
进程间通信:
我们知道进程之间数据是相互隔离的,要想实现进程间的通信,就必须借助于一些技术才可以,比如木楼梯processing 模块中的,对列和管道,这两种方法v都是可以实现进程间数据传输的 ,由于队列是管道假锁 方式实现,所以我们看重研究队列即可.
创建共享的进程队列,queue是多进程安全的队列,可以使用queue实现多进程之间的数据传递.
生产者与消费者:
在并发编程中使用生产者模式能够解决大部分并发问题.该模式下通过平衡生产线和消费线程的工作能力来提高程序的整体处理数据的速度
什么是生产者消费者模式
就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通信,而通过阻塞队列来进行通信
爲什麽使用生產者和消費者模式
在綫程世界裏,生產者就是生產數據的綫程,消費者就是消費數據的綫程,在多綫程開發中,如果生產者處理速度很快,爾消費者處理速度很慢,生產者就得等消費者,爲了解決這樣的問題,引入了生產者和消費者模式
綫程:
什麽是綫程
在傳統操作系統中,每個進程有一個地址空間,而且默認就有一個控制綫程
綫程就像一條流水綫工作的過程,一條流水綫必須屬於一個車間,一個車間的工作工程是一個進程
因此,进程知识用来吧资源集中到一起,而线程才是cpu上的执行单位
线程的创建开销小
创建进程的开销要远大于线程,因为不同的进程是竞争关系
而线程是共同协作的关系,不会自己干自己
线程和进程的区别
1.线程与创建它的进程共享空间地址,进程有自己的空间地址
2.线程可以直接访问其进程的数据段,进程有自己的父进程数据段的副本
3.线程可以直接与其进程里面的其他线程通信,但是进程必须使用进程间通信来与同级进程通信
4.创建新的线程很容易,但是新的进程需要复制它的父进程才可以
5.线程可以控制同一进程下的同级线程,但是进程只能控制自己的子进程
6.主线程发送变化可能会影响到其他线程的行为,但父进程发送变化不会队子进程发送影响
为何要用多线程
多线程指的是在一个进程中开启多个线程/简单来说就是让多个任务公用一块地址空间,那么必须在一个进程内开启多个线程.
GIL锁
gil本质就是一把互斥锁,既然是互斥锁,那他就能把并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全
对于计算来说,cpu越多越好,但是对于I/O来说,再多的cpu都没什么用处,当然dui运行一个程序来说,随着cup的增多,执行效率肯定会有所提高
因为程序基本数不会是纯计算或者纯I/O,所以我们只能相对的去看一个程序到底是计算密集型还是i/o密集型,从而分析python的多线程用处