python多线程中线程锁的使用
定义两个函数分别循环输出数字和字母
import time
import string
def func1():
for i in range(1,52,2):
print(i,end='')
print(i+1,end='')
time.sleep(0.1)
def func2():
for j in list(string.ascii_uppercase):
print(j)
time.sleep(0.1)
if __name__ == '__main__':
func1()
func2()
执行结果为:
为了让两个函数能够同时执行,我们尝试添加线程让其交替执行
添加线程threading后的代码:
import time
import string
import threading
def func1():
for i in range(1,52,2):
print(i,end='')
print(i+1,end='')
time.sleep(0.1)
def func2():
for j in list(string.ascii_uppercase):
print(j)
time.sleep(0.1)
if __name__ == '__main__':
t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t1.start()
t2.start()
t1.join()
t2.join()
print('----执行结束-----')
结果如下:
发现并没有按想象的那样顺序交替执行,而是有点无章则的输出
于是乎想到了线程中线程锁这个东西,添加后果然能够按我们所想的那样顺序交替执行输出了
添加线程锁之后的代码:
import time
import string
import threading
def func1():
for i in range(1,52,2):
lock2.acquire() # 上第二把锁
print(i,end='')
print(i+1,end='')
lock1.release() # 释放第一把锁
time.sleep(0.1)
def func2():
for j in list(string.ascii_uppercase):
lock1.acquire() # 重新又把第一把锁上
print(j)
lock2.release() # 释放第二把锁
time.sleep(0.1)
if __name__ == '__main__':
lock1 = threading.Lock()
lock2 = threading.Lock()
t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
lock1.acquire() # 提前上一把锁lock1
t1.start()
t2.start()
t1.join()
t2.join()
print('----执行结束-----')
打印输出结果: