python - 在 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()
解决方案
- 所有三个线程开始
showbar
并在他们的 for 循环的第一次迭代时showpython
暂停- 它们暂停是因为 lock.acquire() 阻塞,直到锁被释放并且这些锁在它们启动之前在主线程中被获取。
showfoo
获取锁;做某事;然后释放另一个锁- 这允许其他线程之一获取锁;做点什么; 释放不同的锁。
您设计锁定获取和释放的方式导致线程按顺序运行。
推荐阅读
- docker - 在 docker 中启动的 Spring Boot 应用程序无法访问环境变量
- html - 如何使用flexbox对齐容器右侧的两个文本框
- javascript - 使用multer在nodejs中上传大文件
- javascript - 仅当工作表“每日 #s WK1”中的单元格 c2 更改时如何运行谷歌脚本
- qt - 壁纸插件 KDE 等离子中的 config.qml
- php - 使用 PHP 列出所有逗号分隔的值
- java - 我知道如何在数据集上执行 orderBy("a", "b"...), a groupBy。我需要独立地执行计算并处理每个记录子集
- python - Celery 命令行错误 autodiscover_tasks
- javascript - javascript replace() 不适用于 3 个点
- python-3.x - 如何更新列表以使列表中的每个值都转换为字符串?