Python 以线程安全的方式在本地抑制警告

Posted

技术标签:

【中文标题】Python 以线程安全的方式在本地抑制警告【英文标题】:Python locally suppress warnings in thread-safe way 【发布时间】:2019-05-08 15:00:18 【问题描述】:

我有一个多线程程序,其中一行导致我想静音的警告。我不想让代码中其他任何地方的警告静音。

按照in the docs的建议,我可以这样做:

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

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

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

【问题讨论】:

【参考方案1】:

你可以用线程接口来做到这一点。 Lockacquire()方法会在w​​ith块开始执行时被调用,在block退出后会调用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()

【讨论】:

感谢您的回答!正如我所说,我意识到锁定是可能的,但我不想用锁来保护函数——我想要像contextlib.suppress 这样不妨碍多线程处理的东西,但用于警告。 (我意识到这可能是不可能的,但我找不到任何东西来证实它不是)。

以上是关于Python 以线程安全的方式在本地抑制警告的主要内容,如果未能解决你的问题,请参考以下文章

+= 运算符在 Python 中是线程安全的吗?

python-进程与线程 三

如何制作线程本地库实例?

访问 SQL CE 数据库的线程安全方式

有没有办法中断,终止或以其他方式解除(释放同步锁)一个死锁的Java线程,允许其他线程继续?

如何在 Java 中以线程安全的方式使用 mkdirs?