我发现稍后导入模块时会重新创建一些定义全局对象的模块:
# mymodule
pool = MyPoolObject()
如果从某些代码访问:
def f():
from mymodule import pool
print id(pool)
后续调用f打印不同的ID!这是令人惊讶的。我希望当f退出时,它最后一次引用mymodule并且全局被卸载。我不能在f的调用者中引用mymodule,因为最终它的RPC服务不知道它将调用哪些模块(它接收pickle对象并调用它们)。
有没有一种好方法可以避免这种行为并防止全局变量被卸载?一个快速的解决方法是在sys中添加引用:
# mymodule
import sys
sys._mymodule_pool = MyPoolObject()
pool = sys._mymodule_pool
......但即便如此,也不能保证它不会被卸载。