对于我创建的以下类,我的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 次 |
最近记录: |