我有一个处理标准输入上的文件列表的任务。程序的启动时间很长,每个文件花费的时间差异很大。我想产生大量的这些进程,然后将工作分派给不忙的人。有几种不同的命令行工具几乎可以满足我的要求,我将其缩小为两个几乎可以使用的选项:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
问题是split
进行纯循环,因此其中一个进程落后于并停留在后面,从而延迟了整个操作的完成;而parallel
想要每N行或每字节输入生成一个进程,而我花了太多时间在启动开销上。
是否有这样的东西可以重用进程和馈送线到任何具有无阻塞标准输入的进程?
myjob
准备接收更多输入。没有办法知道程序已准备好处理更多输入,您只能知道某个地方的某些缓冲区(管道缓冲区,stdio缓冲区)已准备好接收更多输入。准备就绪后,您可以安排程序发送某种请求(例如显示提示)吗?
read
调用做出反应的FUSE文件系统就可以解决问题。那是相当大的编程努力。
-l 1
在parallel
args中使用?IIRC,告诉每个进程并行处理一行输入(即,每个myjob分支使用一个文件名,因此启动开销很大)。
split
命令从哪里来?该名称与标准文本处理实用程序冲突。