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()
方法会在with块开始执行时被调用,在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 以线程安全的方式在本地抑制警告的主要内容,如果未能解决你的问题,请参考以下文章