进程部分(IPC机制及生产者消费者模型)和线程部分

进程部分

一:进程间通信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:

 

 

                                         

 

               

            

            

                 

                 

             

             

 

posted @ 2018-09-06 20:12  &nbsp  阅读(240)  评论(0编辑  收藏  举报