Python中线程库如何实现线程锁与释放锁

  介绍

小编给大家分享一下Python中线程库如何实现线程锁与释放锁,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

控制资源访问

前文提到线程库在多线程时,对同一资源的访问容易导致破坏与丢失数据。为了保证安全的访问一个资源对象,我们需要创建锁。

示例如下:

import 线程   import 时间      class  AddThread ():   ,,,def  __init__(自我,,=0开始):   ,,,,,,,self.lock =, threading.Lock ()   ,,,,,,,self.value =,开始      ,,,def 增量(自我):   ,,,,,,,印刷(“Wait  Lock")   ,,,,,,,self.lock.acquire ()   ,,,,,,,试一试:   ,,,,,,,,,,,印刷(“Acquire  Lock")   ,,,,,,,,,,,self.value  +=1   ,,,,,,,,,,,印刷(self.value)   ,,,,,,,最后:   ,,,,,,,,,,,self.lock.release ()      def 工人(一个):   ,,,time . sleep (1)   ,,,a.increment ()      时间=addThread  AddThread ()   for 小姐:拷贝范围(3):   ,,,t =, threading.Thread(目标=工人,,args=(addThread,))   ,,,t.start ()

运行之后,效果如下:

 Python中线程库如何实现线程锁与释放锁

获得()会通过锁进行阻塞其他线程执行中间段,释放()释放锁,可以看的到,基本都是获得锁之后才执行。避免了多个线程同时改变其资源对象,不会造成混乱。

判断是否有另一个线程请求锁

要确定是否有另一个线程请求锁而不影响当前的线程,可以设置获得()的参数阻塞=False。

示例如下:

import 线程   import 时间      def  worker2(锁):   ,,,印刷(“worker2  Wait  Lock")   ,,,while 正确的:   ,,,,,,,lock.acquire ()   ,,,,,,,试一试:   ,,,,,,,,,,,印刷(“Holding")   ,,,,,,,,,,,time . sleep (0.5)   ,,,,,,,最后:   ,,,,,,,,,,,印刷(“not  Holding")   ,,,,,,,,,,,lock.release ()   ,,,,,,,time . sleep (0.5)      def  worker1(锁):   ,,,印刷(“worker1  Wait  Lock")   ,,,num_acquire =0   ,,,value =0   ,,,while  num_acquire  & lt;, 3:   ,,,,,,,time . sleep (0.5)   ,,,,,,,have_it =, lock.acquire(阻塞=False)   ,,,,,,,试一试:   ,,,,,,,,,,,value  +=1   ,,,,,,,,,,,印刷(值)   ,,,,,,,,,,,印刷(“Acquire  Lock")   ,,,,,,,,,,,if  have_it:   ,,,,,,,,,,,,,,,num_acquire  +=1   ,,,,,,,最后:   ,,,,,,,,,,,印刷(“release  Lock")   ,,,,,,,,,,,if  have_it:   ,,,,,,,,,,,,,,,lock.release ()      时间=lock  threading.Lock ()   时间=word2Thread  threading.Thread (   ,,,=worker2目标,   ,,,的名字=& # 39;work2& # 39;   ,,,arg游戏=(锁)   )   word2Thread.start ()   时间=word1Thread  threading.Thread (   ,,,=worker1目标,   ,,,的名字=& # 39;work1& # 39;   ,,,arg游戏=(锁)   )   word1Thread.start ()

运行之后,效果如下:

 Python中线程库如何实现线程锁与释放锁

这里,我们需要迭代很多次,work1才能获取3次锁。但是尝试了很8次。

前锁文,我们通过lock.acquire()与lock.release()实现了锁的获取与释放,但其实我们Python还给我们提供了一个更简单的语法,通过用锁来获取与释放锁。

示例如下:

import 线程   import 时间      class  AddThread ():   ,,,def  __init__(自我,,=0开始):   ,,,,,,,self.lock =, threading.Lock ()   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Python中线程库如何实现线程锁与释放锁