一个简单的例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import multiprocessing
class Klass(object):
def __init__(self):
print "Constructor ... %s" % multiprocessing.current_process().name
def __del__(self):
print "... Destructor %s" % multiprocessing.current_process().name
if __name__ == '__main__':
kls = Klass()
在current_process
中执行__del__
时运行时出错:
Constructor ... MainProcess
Exception AttributeError: "'NoneType' object has no attribute 'current_process'" in <bound method Klass.__del__ of <__main__.Klass object at 0x7f5c34e52090>> ignored
如果我更改变量名称:
als = Klass()
它得到了正确的结果:
Constructor ... MainProcess
... Destructor MainProcess
我尝试了很多变量名,有些没问题,有些错误。
为什么不同的实例名称会导致__del__
中的多处理模块为无?
答案 0 :(得分:9)
代码提出
AttributeError: "'NoneType' object has no attribute 'current_process'"
如果在multiprocessing
被删除之前删除了全局变量kls
。
通常,删除对象的顺序是不可预测的。但是,per the docs:
从版本1.5开始,Python保证在删除其他全局变量之前,从其模块中删除名称以单个下划线开头的全局变量;如果不存在对此类全局变量的其他引用,这可能有助于确保在调用
__del__()
方法时导入的模块仍然可用。
因此,如果您将实例命名为_kls
(带有下划线),那么您可以放心,在删除__del__
之前将调用multiprocessing
:
import multiprocessing
class Klass(object):
def __init__(self):
print "Constructor ... %s" % multiprocessing.current_process().name
def __del__(self):
print "... Destructor %s" % multiprocessing.current_process().name
if __name__ == '__main__':
_kls = Klass()
产量
Constructor ... MainProcess
... Destructor MainProcess
Other methods确保在删除模块之前调用del
方法包括
atexit
Klass
的属性。