我正在开发一个web应用程序,其中我在前端运行Java,在后端运行shell脚本。该应用程序主要用于分析许多文件,并且java程序从用户获得输入,例如他们想要分析哪个文件,他们想要analyze.Lets从哪一天到哪一天,假设用户提供从7月1日到8日的数据。我需要处理8天的文件。每天大约有100个文件需要处理。所以我的目标是让这个过程是并行的,而不是顺序的。关于这一点我基本上有两个想法。我想和你们分享这个,并征求你们的建议。
计划1:有一个Java程序(业务层),它使用进程构建器调用shell脚本。我可以按用户将给定的日期拆分为4个线程,每个线程执行两天的操作吗?例如(1-2)线程1和(3-4)线程2,它继续下去。如果我遵循这种方法,那么所有的利弊都是什么?另外,如何通过这种方法在线程之间进行协调。
计划2:从Java调用shell脚本,在shell脚本内部生成多个进程,正如我前面所说的,我可以派生进程1来完成date (1-2)和进程2 (3-4)的工作,然后继续下去。这种方法的优点和缺点是什么?我将处理后的输出写入到一个文件中。那么,如果我有多个进程,如何让多个进程更新单个文件。
还有与我的问题相关的任何链接的任何引用
重要:正如我所说的,我每天都需要在shell脚本中处理100个日志文件,我的要求之一是不断更新前端环境,了解shell脚本中作业的状态(即第一天已经完成,第二天已经完成等等)。我知道我可以从shell脚本中执行echo,然后我就可以从Java中获得值。但问题是,如果我在shell脚本中回显,在处理文件的循环中,我的调用终止,我必须再次从Java回调。任何关于如何使此更新发生的想法。
发布于 2012-07-19 00:32:30
首先,我建议考虑优化的第一条规则:不要优化。
然后,如果你真的认为你需要优化它,我会选择第一种方法,并尽可能多地使用Java。
一种方法可能如下: 1)使用ProcessBuilder运行所有进程并创建一个List<Process>
2)将每个进程包装成一个ShellScriptProcess并获取一个List<ShellScriptProcess>
class ShellScriptProcess implements Runneable() {
private Process process;
public ShellScriptProcess(Process process) {
this.process=process;
}
boolean synchronized finished = false;
public void run() {
process.waitFor(); //this will wait until the process terminates
finished = true;
}
public boolean isFinished(){
return finished;
}
}
3)等待进程完成
while(!allFinished) {
for (ShellScriptProcess sp : shellScriptProcesses) {
allFinished = true;
if (sp.isFinished()) {
// hurray, a process has finished, inform the UI
// you want to do something smarter here though,
//like removing the finished processes from the list
}
else {
allFinished = false;
}
}
}
这只是一个非常粗略的解决方案,只是为了演示如何实现这一点。并且我没有测试代码,它可能包含语法错误:)希望这能有所帮助。
https://stackoverflow.com/questions/11544955
复制相似问题