提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。
本篇主要目的,为大家说一下,在python的多线程开发中如何保证数据的正确性,首先明确一点,为什么在多线程的时候会发生数据问题?
其实在多个线程同时工作的时候,如果没有一定的措施,会导致争抢资源,而结果显而易见的,就是资源的缺失,就是说,一个线程从上一个线程哪里拿到的资源是不完整的
因此针对这一现象,Python有了第一种解决方法:互斥锁
,就是多个线程去拿资源,谁拿到我们控制不了,但是我们可以控制当一个线程拿到资源之后,对这个资源上锁,不让其他线程使用了,让它们等该线程使用完,再开始争抢,这里注意,抢到资源的标识就是谁先拿到了互斥锁,并且上了锁
python">import threading
import timeaa = 0#全局变量创建互斥锁,本质上是threading模块的一个函数
lock = threading.Lock()def p():lock.acquire() #上锁for i in range(1000000000) :global aaaa += 1print(aa)lock.release() #解锁def q():lock.acquire() #上锁for i in range(1000000000) :global aaaa += 1print(aa)lock.release() #解锁if __name__ == '__main__' :a = threading.Thread(target=p)a.start()b = threading.Thread(target=q)b.start()结果:
1000000000
2000000000
使用互斥锁的时候,一定要明白,让程序正常运行的是锁,而不是被锁的数据
除了上面这种方式,Python还有另外一种方式就是join等待
python">import threading
import timeaa = 0def p():for i in range(100000) :global aaaa += 1print('a线程',aa)def q():for i in range(100000) :global aaaa += 1print('b线程',aa)if __name__ == '__main__' :a = threading.Thread(target=p)b = threading.Thread(target=q)a.start()a.join()b.start()
这种方式也可以,但是不完美,也不推荐使用这种方式,因为join方法作用和其他语言中的join一样,并不能一定影响线程执行的先后,只能说是一种增加等待的可能性
但是注意,凡是个锁,就有可能造成死锁,就是说上一个用锁的人,由于某些原因没有解开这把锁,那其他的线程就会一直等待,造成了死锁,所以大家使用锁的时候一定要注意!!!!