我有一行的多线程程序,该行会引起我要静音的警告。我不想使代码中其他任何地方的警告保持沉默。

我可以按照in the docs的建议执行此操作:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    line_that_causes_warning()

但是文档也说it's not thread-safe,因为它设置了模块级警告过滤器。

我意识到我可以用一些疯狂的方法来解决该问题,例如用锁保护该部分,但是有没有一种很好的方法来使该线程安全?

最佳答案

您可以使用线程接口(interface)来实现。在开始执行with块时,将调用锁定acquire()方法,而在退出该块之后,将调用release()方法。

import warnings
import threading

lock_for_purpose = threading.RLock()
print(lock_for_purpose)
def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with lock_for_purpose:
    print("lock is done")
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        fxn()

关于Python以线程安全的方式在本地抑制警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56043644/

10-13 03:46