Python-如何将线程变成线程安全

时间:2018-10-12 21:08:47

标签: python multithreading thread-safety

所以我一直在想如何使线程安全,原因是每当我运行我创建的程序只是为了好玩时。我意识到控制台发了很多垃圾邮件,以至于无法一一打印出来。

我所做的基本上是,我使用的列表列表并没有什么特别的,只是说了一系列不同的水果

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()

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

如何将其转变为一种线程安全的?每个线程开始的那种睡眠会神奇吗?

1 个答案:

答案 0 :(得分:3)

您可能想研究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释放锁为止。