在Python的主线程中使用线程锁定时



下面的代码中锁定了什么,当其他线程之前启动时,为什么代码可以使用lock.acquire,并释放这个锁定?那么锁是干什么的呢?

我想表达的是,锁是主线,代码是让文本看起来有序,我能凭直觉理解,而不是凭逻辑。也许我缺乏一些关于线程的知识。

import threading
import sys
import time
import pdb

def showfoo(n):
for _ in range(n):
lockpython.acquire()  # 获取对方的锁,释放自己的锁
print('foo',end="")
sys.stdout.flush()  # 释放缓冲区
lockfoo.release()
time.sleep(1)

def showbar(n):
for _ in range(n):
lockfoo.acquire()  # 获取对方的锁,释放自己的锁
print('bar',end="")
sys.stdout.flush()  # 释放缓冲区
lockbar.release()
time.sleep(1)
def showpython(n):
for _ in range(n):
lockbar.acquire()  # 获取对方的锁,释放自己的锁
print('python',end="")
sys.stdout.flush()  # 释放缓冲区
lockpython.release()
time.sleep(1)
if __name__ == '__main__':
lockfoo = threading.Lock()  # 定义3个互斥锁
lockbar = threading.Lock()
lockpython = threading.Lock()
n = int(input())
t1 = threading.Thread(target=showfoo, args=[n])  # 定义3个线程
t2 = threading.Thread(target=showbar, args=[n])
t3 = threading.Thread(target=showpython, args=[n])
lockfoo.acquire()  # 先锁住foo,bar锁,保证先打印foo
lockbar.acquire()
t1.start()
t2.start()
t3.start()
  • 所有三个线程都启动
  • showbarshowpython在for循环的第一次迭代上暂停
    • 他们暂停,因为lock.acquise((会阻塞直到锁被释放,并且这些锁在启动之前是在主线程中获取的
  • CCD_ 4获取锁;做某事;然后释放另一个锁
    • 这允许其他线程之一获取锁;做某事;释放另一个锁

您设计锁获取和释放的方式会导致线程按顺序运行。

最新更新