Python机器学习与可视化分析实战
上QQ阅读APP看书,第一时间看更新

1.3.2 threading中Lock类

虽然线程可以在程序的执行过程中极大地提高程序的运行效率,但是其带来的影响却难以忽略。例如,在【程序1-2】中,每隔一定时间打印当前的数值,应该逐次打印的数据却变成了2个相同的数值被打印了出来,因此需要一个能够解决这类问题的方案。

Lock类是threading中用于锁定当前线程的锁定类,顾名思义,其作用是对当前运行中的线程进行锁定,被锁定的对象只有被当前线程释放后,才能由后续线程继续操作。类中主要代码如下:

    import threading
    lock = threading.Lock()
    lock.acquire()
    lock.release()

acquire方法提供了确定对象被锁定的标志,release用于当前线程使用完对象后释放当前对象。修改后的代码如程序1-3所示。

【程序1-3】

    # coding = utf8
    import threading,time,random
      
    count = 0
    class MyThread (threading.Thread):
      
       def __init__(self,lock,threadName):
          super(MyThread,self).__init__(name = threadName)
          self.lock = lock
      
       def run(self):
          global count
          self.lock.acquire()
          for i in range(100):
              count = count + 1
              time.sleep(0.3)
              print(self.getName() , count)
          self.lock.release()
      
       lock = threading.Lock()
       for i in range(2):
          MyThread (lock,"MyThreadName:" + str(i)).start()

【代码解析】

Lock被传递给MyThread,并在run方法中锁定当前的线程,必须等线程执行完毕后,后续的线程才可以继续执行。

程序执行结果如图1.17所示。从图中可以看到,其中框住的部分,线程2只有等线程1完全结束后,才执行后续的操作,即在本程序中,myThreadName:1等到myThreadName:0完全结束后,才执行后续操作。

图1.17