何时在 Jython 中使用 cleanup()

When to use cleanup() in Jython

在Jython的PythonInterpreter中每次都需要在close()之前调用cleanup()吗?

我一直在阅读文档,但没有找到有关此功能的太多信息。 javadocs don't say anything at all. The closest information I've found is here, in readthedocs,他们解释说在某些情况下使用线程进行清理是必要的,我什至不确定他们指的是这个特定的函数。

我想知道我什么时候需要调用 cleanup()... 如果答案总是如此,那么他们为什么要将 cleanup()close() 分开的函数?

好的,我一直在阅读 Jython 源代码并进行了一些测试。这是我发现的:

cleanup() 的作用:它负责未处理的资源,如 运行 线程和文件。

什么cleanup()没有:以任何形式重置解释器的状态;保留导入的模块和定义的变量。

以下示例展示了此行为:

示例 1

让我们导入一个模块,定义一个变量并打开一个文件。

PythonInterpreter py = new PythonInterpreter();

String code1 = "import sys;"
        + "a=45;"
        + "f = open('test.txt')";
String code2 = "print(sys.version_info);"
        + "print(a);"
        + "print(f.closed)";

// first execution
py.exec(code1);
py.exec(code2);

// second execution
py.cleanup();
py.exec(code2);

py.close()

输出

sys.version_info(major=2, minor=7, micro=2, releaselevel='final', serial=0)
45
False
------
sys.version_info(major=2, minor=7, micro=2, releaselevel='final', serial=0)
45
True

模块 sys 和变量 af 在清理后仍然存在且具有相同的值,但打开的文件已关闭。

示例 2

为此,func 是一个慢函数,需要大约 2 秒才能完成(比正常的 cleanup() 长)。

PythonInterpreter py = new PythonInterpreter();

String code3 = "from threading import Thread\n"
        + "def func():\n"
        + "  print 'th start'\n"
        + "  for i in range(0,20000000):\n"
        + "    x=i\n"
        + "  print 'th done'\n"
        + "th = Thread(target=func)\n"
        + "th.start()";
String code4 = "print th.isAlive()\n"
        + "th.join()";

// first execution
py.exec(code3);
py.exec(code4);
System.out.println("------");   

// second execution
py.exec(code3);
py.cleanup();
py.exec(code4);

py.close();

输出:

th start
True
th done
------
th start
th done
False

在第一次执行时,主线程有足够的时间检查th是否存活并打印它。在第二个中,它总是等待 th 完成,这意味着 cleanup() 在某处加入线程。

结论

正如@mzjn 指出的那样,close() 函数调用 cleanup() 并且这是有道理的,所以 你永远不需要在 [=24= 之前调用 cleanup() ]。您可能需要手动调用它的唯一情况是,如果您想继续使用 PythonInterpreter 但需要关闭所有打开的文件并加入所有线程。