这是上一篇《用任务分发系统Gearman来加速你的计算任务》的续。
昨天处理一个个可并行化的的CPU密集型计算任务:每个任务里面包括一些有先后关系的子任务,其中一些任务可以并行执行,其后的任务则必须在它们都执行完之后才能继续。工作流如下所示:
|-> subjob2 |
JOB1: subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
|-> subjob4 |
|-> subjob2 |
JOB2: subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
|-> subjob4 |
|-> subjob2 |
JOB3: subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
|-> subjob4 |
困扰于大段的shell命令,写了一个很实用的脚本crun执行部分可并行化的链式任务,即执行一个JOB。
由于JOB里面的subjob都是CPU密集型的,那么多个JOB最好用计算机集群来实现并行化。昨天很脑残忘了还有Gearman了,自己写任务分发模块,结果到今天早上都没搞定。最后用Gearman一个小时即搞定。
新的经验:
利用”done”文件(受lock文件启发)检测后台运行的任务是否完成:在任务命令前面加删除done文件的命令,后面加写done文件的命令,运行后通过持续检测done文件是否存在来确定后台任务是否完成。Shell实例如下
if [ -s .done ]; then rm .done; fi; echo 'job starts' && sleep 5 && echo 'job ends' && echo 'done' > .done & while [[ true ]]; do if [ -s .done ]; then echo 'it finished!'; break; fi; sleep 1; done;
其它: