python - Python - 如何将线程变成线程安全的
问题描述
所以我一直在考虑如何让线程安全,原因是每当我运行我创建的程序时只是为了好玩。我意识到控制台收到了太多垃圾邮件,以至于它的速度不够快,无法一一打印。
基本上我所做的是我使用了一个没有特别的列表,而不仅仅是一个不同水果的列表让我们说
list = ['apple','banana','kiwi'....]
然后我有一个叫做data
基本上使用记录器打印出来的东西。
logger.log(data)
完整的程序看起来像
def sendData(list, data):
logger.log(data)
def main():
...
...
...
data_list.append((list[i], data))
for index, data in data_list:
threading.Thread(target=sendData, args=(list, data)).start()
所以基本上正如我们所看到的,这可能是很多线程同时运行,这会导致交互导致控制台打印出很多错误,所以现在的问题是:
我怎样才能把它变成一种线程安全的?每个线程开始的睡眠会是魔法吗?
解决方案
您可能想研究一下threading.Lock()
,它可用于防止多个线程同时执行输出任务,从而在控制台中混合单词:
def sendData(list, data):
with lock:
logger.log(data)
lock = threading.Lock()
def main():
...
...
...
data_list.append((list[i], data))
for index, data in data_list:
threading.Thread(target=sendData, args=(list, data)).start()
这将防止多个线程同时运行“with”中的代码。
当一个线程 X 进入 "with" 块时,它将获得锁。如果另一个线程试图认领它(进入“with”块),它必须等到锁被线程 X 释放。
推荐阅读
- java - 加密文件夹并使用 java 应用程序打开
- java - 如何在java中的两个DateTime-Local之间获取DateTime-Local
- python-3.x - 如何在gurobi中定义目标的数值
- java - XStream 中的单元素数组错误
- jenkins - ext-email 插件,不从管道向默认收件人发送电子邮件
- javascript - NodeJS For 循环承诺
- typescript - 无法将复杂数据分配给Angular 6中的数组变量
- amazon-web-services - 获取错误“不支持指定的 HTTP 版本。” 使用 nginx 代理时,传递签名的 url 以在 AWS S3 中下载文件
- c# - char.MaxValue 与字符串索引搜索有什么关系?
- css - 视频网格,动画放大一个,保持其余部分的结构?