Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中调用Pythonscript-在Java中线程化后慢Python_Java_Python_Multithreading_Jython - Fatal编程技术网

在Java中调用Pythonscript-在Java中线程化后慢Python

在Java中调用Pythonscript-在Java中线程化后慢Python,java,python,multithreading,jython,Java,Python,Multithreading,Jython,我从java类调用python脚本,如下所示: // build aruments for Script state.get().argv.clear(); state.get().argv.append(new PyString("")); state.get().argv.append(new PyString("-i" + Ifolder.toString())); state.get().argv.append(new PyString("-o" + Ofolder.toString()

我从java类调用python脚本,如下所示:

// build aruments for Script
state.get().argv.clear();
state.get().argv.append(new PyString(""));
state.get().argv.append(new PyString("-i" + Ifolder.toString()));
state.get().argv.append(new PyString("-o" + Ofolder.toString()));

// craete PythonInterpreter with those arguments
PythonInterpreter interp = new PythonInterpreter(null, state.get());

// invode LawLinker
interp.execfile("src/scriptx.py");
private static final ThreadLocal<PySystemState> state = new ThreadLocal<PySystemState>() {
    @Override
    protected PySystemState initialValue() {
        return new PySystemState();
    }

};
state是一个Threadlocal变量,如下所示:

// build aruments for Script
state.get().argv.clear();
state.get().argv.append(new PyString(""));
state.get().argv.append(new PyString("-i" + Ifolder.toString()));
state.get().argv.append(new PyString("-o" + Ofolder.toString()));

// craete PythonInterpreter with those arguments
PythonInterpreter interp = new PythonInterpreter(null, state.get());

// invode LawLinker
interp.execfile("src/scriptx.py");
private static final ThreadLocal<PySystemState> state = new ThreadLocal<PySystemState>() {
    @Override
    protected PySystemState initialValue() {
        return new PySystemState();
    }

};
private static final ThreadLocal state=new ThreadLocal(){
@凌驾
受保护的PySystemState初始值(){
返回新的PySystemState();
}
};
我必须将其设置为ThreadLocal,因为否则每个线程都会使用相同的参数(即相同的状态)调用Pythonscript

这就是奇怪的部分

如果一次只运行一个线程,脚本的执行速度会越来越快。
但是,如果我一次运行多个线程,那么执行也需要相同的时间,而且时间相当长…大约5秒。 另外,它并不是创建一个需要最长时间的PySystemState和PythonInterpreter的新实例,而是脚本的实际执行


有人能给我解释一下吗?

PySystemState必须是静态的吗?似乎暗示他们不应该这样。它们必须是线程本地的唯一原因是因为它们是静态的,对吗?不需要是静态的,我不知道为什么。它需要是Threadlocal,因为每个线程都必须为解释器设置自己的状态。我不能把它放在线程方法中,因为这会给我相同的性能中断。如果它不是静态的,它就不需要是Threadlocal,它可以是一个局部变量或实例变量线程函数或对象。只有静态/全局变量需要是线程本地的。同时,问题似乎暗示,至少在2.5.3中,
PySystemState
中/使用了各种静态/全局变量,因此即使您将
PySystemState
本身保持为本地或线程本地,它实际上并不安全,并且添加了大量额外的锁,即使在安全的情况下,这些锁也可能会序列化您的代码GIT样式。你能告诉我你的线程是否真的是并行运行的(例如,4个核以100%而不是100/0/0/0)?你是对的,它也可以作为一个局部变量工作,但是如果我一次只运行一个线程,我的性能就不如使用ADLOCAL时。由于某些原因,脚本的执行需要更长的时间。