首页 > 解决方案 > 在 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()

标签: pythonmultithreading

解决方案


  • 所有三个线程开始
  • showbar并在他们的 for 循环的第一次迭代时 showpython 暂停
    • 它们暂停是因为 lock.acquire() 阻塞,直到锁被释放并且这些锁在它们启动之前在主线程中被获取。
  • showfoo获取锁;做某事;然后释放另一个锁
    • 这允许其他线程之一获取锁;做点什么; 释放不同的锁。

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


推荐阅读