我有一个python脚本,可下载一个文本文件,逐行读取并将读取的行发送给java。我需要将此操作限制为5秒,然后接收python读取的所有内容。
要测试一切是否正常,我尝试了以下方法:
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
class ProcessTest {
public static void main(String args[]) {
try {
File file = new File("/home/local/seconds.py");
BufferedReader reader = new BufferedReader(new FileReader(file));
String testCase = "", temp = "";
while ((temp = reader.readLine()) != null) {
testCase = testCase.concat(temp + '\n');
}
reader.close();
ProcessBuilder pb = new ProcessBuilder("python", "-c", testCase);
Process p = pb.start();
if (!p.waitFor(5, TimeUnit.SECONDS)) {
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((temp = reader.readLine()) != null) {
System.out.println(temp);
}
p.destroy();
System.out.println("not ended");
} else {
System.out.println("ended");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
seconds.py文件
from time import sleep
for i in range(1,11):
print(i)
sleep(1)
预期结果:
正如我将过程waitFor
的值指定为5秒一样,该代码最多只能打印五个。
获得的结果: 该代码执行超过5秒钟,最多可打印10个。
如何设置进程超时并在缓冲区中打印内容?
答案 0 :(得分:0)
waitFor
在这种情况下不正确。
waitFor
不会更改该过程产生的输出量。无论等待多长时间,循环都会消耗该过程可能产生的每一行输出。
因此,在大多数系统上,如果不定期使用其输出,则进程可能会挂起,因此waitFor
在与用于打印输出的进程一起使用时可能无法达到预期的效果。
正如其他人指出的那样,p.wait();
在这里是不正确的。该方法与过程无关。它是继承的Object.wait方法,用于多个线程之间的协作。
最简单的方法是简单地检查经过时间:
Process p = pb.start();
long startTime = System.currentTimeMillis();
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((temp = reader.readLine()) != null) {
long time = System.currentTimeMillis();
if ((time - startTime) >= 5000) {
p.destroy();
System.out.println("not ended");
}
System.out.println(temp);
}
if (temp == null) {
System.out.println("ended");
}
reader.close();