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

zal*_*ale 5 python multithreading

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

我可以按照文档中的建议执行此操作:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    line_that_causes_warning()
Run Code Online (Sandbox Code Playgroud)

但是文档也说它不是线程安全的,因为它设置了模块级警告过滤器。

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

Erç*_*çay 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()
Run Code Online (Sandbox Code Playgroud)

  • 感谢你的回答!正如我所说,我意识到锁定是可能的,但我不想用锁来保护函数——我想要像“contextlib.suppress”这样的东西,它不会阻碍多线程,但会发出警告。(我意识到这可能是不可能的,但我找不到任何东西可以证实它不是)。 (3认同)