何时在 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
和变量 a
和 f
在清理后仍然存在且具有相同的值,但打开的文件已关闭。
示例 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
但需要关闭所有打开的文件并加入所有线程。
在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
和变量 a
和 f
在清理后仍然存在且具有相同的值,但打开的文件已关闭。
示例 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
但需要关闭所有打开的文件并加入所有线程。