锁的概念是因为多线程而提出的,必须在线程中才能体现出锁的作用。
没用锁的情况:
import threadingimport timegl_num = 0def show(arg): global gl_num n = gl_num time.sleep(1) gl_num = n+1 print(gl_num)for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start()print ('main thread stop')
main thread stop1111111111
可以看到,在没用锁的情况下,线程同时取到0并加1,结果都为1.
什么是锁?
锁,跟门锁一样,他的作用不是为了锁定这个门,而是为了锁定门后的一方世界,也就是代码块。
import threadingimport timelock = threading.RLock()gl_num = 0def show(arg): lock.acquire() global gl_num n = gl_num time.sleep(1) gl_num = n+1 lock.release() print(gl_num)for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start()print ('main thread stop')
main thread stop12345678910
锁都有那些呢?
两种:Lock(指令锁、RLock(可重入锁)。Lock属于全局,Rlock属于线程。
学习lock和Rlock区别前,我们要搞清楚什么事死锁。
死锁是:比如一辆车被两把锁锁住,你单单拿到一把锁的钥匙,你是开不了这个车的,这就是死锁。当然,这里是抽象的锁概念跟现实还有很大区别。
import threadingimport timelock = threading.Lock()gl_num = 0def show(arg): lock.acquire() print('我只执行一次就被锁住了。',threading.current_thread().name) lock.acquire() time.sleep(1) print(threading.current_thread().name) lock.release() lock.release()for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start()print ('main thread stop')
我只执行一次就被锁住了。 Thread-1main thread stop
那么这死锁怎么解决?呵呵,用Rlock,这因为就是他们的区别了。
import threadingimport timelock = threading.RLock()gl_num = 0def show(arg): lock.acquire() print('我只执行一次就被锁住了。',threading.current_thread().name) lock.acquire() time.sleep(1) print(threading.current_thread().name) lock.release() lock.release()for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start()print ('main thread stop')
我只执行一次就被锁住了。 Thread-1main thread stopThread-1我只执行一次就被锁住了。 Thread-2Thread-2我只执行一次就被锁住了。 Thread-3Thread-3我只执行一次就被锁住了。 Thread-4Thread-4我只执行一次就被锁住了。 Thread-5Thread-5我只执行一次就被锁住了。 Thread-6Thread-6我只执行一次就被锁住了。 Thread-7Thread-7我只执行一次就被锁住了。 Thread-8Thread-8我只执行一次就被锁住了。 Thread-9Thread-9我只执行一次就被锁住了。 Thread-10Thread-10
总结
1、线程如果共用同一个数据(栈、队列),如果相互之间存在数据污染,那么就需要锁的来将操作公共数据的代码块锁起来。
2、锁的获取:lock = threading.Lock()或者lock = threading.RLock(),
3、lock跟RLock的区别,使用多把锁,那就需要Rlock来解决死锁问题。这里说的多把锁,是指一个锁多个嵌套。