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

所以基本上正如我们所看到的,这可能是很多线程同时运行,这会导致交互导致控制台打印出很多错误,所以现在的问题是:

我怎样才能把它变成一种线程安全的?每个线程开始的睡眠会是魔法吗?

标签: pythonmultithreadingthread-safety

解决方案


您可能想研究一下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 释放。


推荐阅读