首页 > 解决方案 > Python 以线程安全的方式在本地抑制警告

问题描述

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

按照文档中的建议,我可以这样做:

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

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

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

标签: pythonmultithreading

解决方案


你可以用线程接口来做到这一点。acquire()在with块开始执行时会调用lock方法,在blockrelease()方法退出后会被调用。

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()

推荐阅读