进程部分
一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间,
但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存
空间,又能解决锁的问题。
有两种解决方案:一种叫管道,另一种叫队列。其中队列就是管道加锁实现的。这两种方式
占用的都是内存空间,但是管道无法解决锁的问题,所以还是要选择队列。例图1:
二:生产者消费者模型:
1:什么是生产者消费者模型:
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:生产者生产数据传递给消费者处理
实现方式:生产者把数据放到队列里,然后消费者从队列里取出数据进行处理。
生产者----->队列<------消费者
2:为何要用生产者消费者模型:
当程序中明显的出现两类任务,一类负责生产数据,一类负责处理数据,
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡
生产能力与消费能力,从而提升效率。 例图2:
但是通过以上案例我们可以发现需求实现了,但是程序一直没有结束,原因是消费者还在
等待着从队列中取数据,尽管此时队列已经空了。所以消费者无法结束,那么主进程也无法
结束,所以才导致整个程序一直没有结束。
所以现在需要让消费者在消费完所有生产者生产的数据后,结束运行。
例图3:还有另外一种,例图3了解:
原理都是一样:都是在主进程里面等待生产者生产完数据后,发出结束信号就可以了。
线程部分:线程理论:
1:什么是线程:
进程其实一个资源单位,而进程内的线程才是cpu上的执行单位
线程其实指的就是代码的执行过程
2:为何要用线程: 线程vs进程
①:同一进程下的多个线程共享该进程内的资源
②:创建线程的开销要远远小于进程
开启线程的两种方式:
方式一(图4):通过threading模块,导入类Thread来开启线程,通过类Thread实例化得到对象,
然后调用对象下的start方法,来开启一个线程。 如图4
方式二(图5):通过自定义一个类的方式来开启线程。如图5:
线程对象相关的属性或方法:
1:同一进程下的多个线程共享该进程内的资源 如图6:
2:pid:通过os模块,os模块下有一个os.getpid 如图7:
3:active_count:可以查看线程活跃的个数 如图8:
4:current_thread:可以查看当前线程 如图9:
守护线程(daemon):守护主线程,一旦主线程结束了,那么守护的子线程也直接结束了。 如图10
线程互斥锁:原理:将并发变成串行,牺牲效率,保证数据安全。 如图11: