上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