【问题标题】:Python locally suppress warnings in thread-safe wayPython 以线程安全的方式在本地抑制警告
【发布时间】: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,因为它设置了模块级警告过滤器。

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

【问题讨论】:

    标签: python multithreading


    【解决方案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 这样不妨碍多线程处理的东西,但用于警告。 (我意识到这可能是不可能的,但我找不到任何东西来证实它不是)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多