我需要从Java应用程序调用python脚本并返回大文本(json响应)。我成功地调用了这个脚本,我可以向Java应用程序返回一些文本。但当我尝试返回完整的json响应时,我的Java应用程序冻结,什么也没有发生。 我如何调用python脚本:
ProcessBuilder pb = new ProcessBuilder(
"python", absolutePath, params
);
Process ps = pb.start();
BufferedReader reader = new BufferedReader(
new InputStreamReader(ps.getInputStream())
);
ps.waitFor();
int ec = ps.exitValue();
StringBuffer HTTPResponse = new StringBuffer();
String inputLine;
while ((inputLine = reader.readLine()) != null) {
logger.debug(String.format("DEBUG!!!: input = %s", inputLine));
HTTPResponse.append(inputLine);
}
父进程和子进程之间出现死锁。在
这是因为在子进程终止之前,java应用程序不会从子进程中读取任何内容。Python将缓冲它的输出(在我的系统中高达64k),一旦缓冲区被填满,它将在下一次写入时阻塞。因为它被阻止了,它不会终止。同时,java父进程也被阻塞,等待子进程终止,这不会自然发生。在
要解决此问题,您需要重新构造Java代码,使其在处理输出之前不等待子代码终止,而是从子代码读取,直到子代码终止,如下所示:
您的Python脚本可以是:
^{pr2}$这将产生1MiB的数据。在
相关问题 更多 >
编程相关推荐