对于我创建的以下类,我的linter经常给我发出未使用的变量警告:
class LockGuard(object):
def __init__(self, mutex):
self.mutex = mutex
self.mutex.acquire()
def __del__(self):
self.mutex.release()
Run Code Online (Sandbox Code Playgroud)
在代码中,每次我使用它时都会收到警告
def do_something(self)
locker = LockGuard(self.mutex)
// do something on the data
return outcome
Run Code Online (Sandbox Code Playgroud)
我知道c ++编译器优化了未使用的变量,我想知道python是否会做同样的事情?因此,删除数据锁定.
wim*_*wim 10
这个短信应该对你有所了解.因为管理上下文的正确方法是使用上下文管理器.
with LockGuard():
# do stuff
Run Code Online (Sandbox Code Playgroud)
将如何获取和释放锁,实现细节LockGuard.__enter__和LockGuard.__exit__分别.
你不应该依赖__init__和__del__为此,因为__del__不可靠.
我知道C++编译器会优化未使用的变量,我想知道Python是否也会这样做?因此,删除数据锁定.
Python不会这样做.有一些窥视孔优化,但没有像完全从范围中删除对象那么激烈.一旦实例的引用计数降为零(即一旦locker名称超出范围),它应该被删除,但是在实现中不能保证何时发生这种情况并且甚至不能保证__del__将调用自定义一点都不
你滥用这个__del__方法.
请参阅文档中object.__del__的巨大警告块:
警告:由于不稳定的情况下,它
__del__()被调用的方法,[...] .特别是:
__del__()可以在执行任意代码时调用,包括来自任意线程.如果__del__()需要锁定或调用任何其他阻塞资源,它可能会死锁,因为资源可能已被执行中断的代码占用__del__(). (强调我的)__del__()可以在解释器关闭期间执行.[...]
正确的解决方案是实现上下文管理器并使用该with语句进入和退出它.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |