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. 设置锁的超时时间

浙公网安备 33010602011771号