python 多任务 学习二

多任务:

1. 多线程

  主线程生成多个子线程,(threading生成子线程),但只拥有同一个主进程的资源,伪多任务

  1. 全局变量

    主线程下的变量, 多任务共享全局变量

                       

                    结果为:

                       

    说明:

      类中创建 函数run(),  通过函数demo()实例化对象来创建线程, 此时线程会自动调用类中的run()来执行。

      全局变量a ,它的值会在线程执行过程中改变。并且是在生成的两个线程中都可以改变。说明此全局变量可以被线程共享使用

    全局变量的问题:

      此代码存在资源竞争问题:当run()中的循环次数增加到足够多时,就会出现一个问题,如,当a的值为3时,一个线程取到了这个值3,并改变了a的值(a=4),另一个线程同时取到a的值3,并改变了a的值(a=4),这时的变量值就会出现误差。循环次数越大,出现这种问题的概率就越大。

      如下图, 1000000次循环,从0开始,每次+1,两个函数循环,最后得到的结果却不是2000000,说明在计算中,出现了资源竞争,有部分值被重复定义,从而出现了最终值错误。

 

                       

                   结果:

                        

 

 

  2.  处理全局变量资源竞争问题---互斥锁

    方法1:

      使用python中的 threading库Lock功能,可以生成一把锁(锁默认是打开的)。

      将每个线程中,改变全局变量的部分用锁锁住(上锁:threading.Lock.acquire()  解锁:threading.Lock.release()), 之后,哪个线程抢先执行到互斥锁的位置,哪个先上锁,其它线程必须等到此线程解锁后,才能继续执行

                        

 

                      结果:

                         

      方法2:

      将互斥锁添加在循环中,锁住全局变量的值变动部分,确保一个线程改变变量的值时,其它线程执行不到变量变动的代码。

      此代码执行时,每个线程抢到的优先执行次数不固定,但最后全局变量的值是一定的。

                         

                    结果:

                          

   3. 死锁问题

    条件:多任务,并有两把以上的锁 

    (互斥锁的使用可以避免多任务中全局变量的资源竞争问题,但是,互斥锁也存在一定的问题,就是死锁)

    死锁案例:

      两个线程(a, b),两把锁(lock_a, lock_b)

      当线程a先加锁lock_a,再加锁lock_b;

      线程b先加lock_b,再加lock_a两把锁,

      此时就会出现,线程a在添加lock_b这把锁时,此锁已经被b线程使用,只能等待线程b解锁后才能执行上锁;

      反之,线程b也需要等待线程a将lock_a锁释放才能继续向下执行。这时,就出现连个线程都无法向下继续执行的情况,就是死锁。

    解决死锁问题:

      1.  主要就是缕清逻辑,合理的分配互斥锁

      2.  设置锁的超时时间

posted @ 2019-09-27 17:22  黑无常  阅读(144)  评论(0)    收藏  举报