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

2024-05-17 17:44:10 发布

您现在位置: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()

Tags: 代码inimportfortimedefsysrange
1条回答
网友
1楼 · 发布于 2024-05-17 17:44:10
  • 所有三个线程都启动
  • showbarshowpython在其for循环的第一次迭代中暂停
    • 它们暂停,因为lock.acquire()阻塞,直到锁被释放,并且这些锁在启动之前在主线程中被获取
  • showfoo获取一个锁;做某事;然后释放另一个锁
    • 这允许其他线程之一获取锁;做点什么;释放另一个锁

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

相关问题 更多 >