Java与Python进程通信优化方案
你现在的实现方式每次调用recognizeSliderGap都会创建一个新的Python进程,这确实会有性能开销。我们可以通过进程池或守护进程的方式优化。这里有几种解决方案:
方案1:使用进程池(推荐)
package reyo.sdk.utils.opencv.slidecaptcha;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import com.google.gson.Gson;
public class SlideDistanceCalculatorPy {
private static final ExecutorService executor = Executors.newFixedThreadPool(1);
private static Process pythonProcess = null;
private static BufferedReader reader = null;
private static PrintWriter writer = null;
private static final Gson gson = new Gson();
public static class RecognitionResult {
private boolean success;
private int center_x;
private String error;
public boolean isSuccess() {
return success;
}
public int getCenterX() {
return center_x;
}
public String getError() {
return error;
}
}
/**
* 初始化Python守护进程
*/
public static synchronized boolean initPythonProcess() {
try {
if (pythonProcess != null && pythonProcess.isAlive()) {
return true;
}
String pythonScript = "C:\\logs\\dnn\\slide_offset_json.py";
ProcessBuilder pb = new ProcessBuilder("python", pythonScript, "--daemon");
pythonProcess = pb.start();
reader = new BufferedReader(new InputStreamReader(pythonProcess.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(pythonProcess.getOutputStream()), true);
// 等待Python脚本准备就绪
Thread.sleep(1000)