为什么这些并行进程的输出没有搞砸?

时间:2016-03-11 06:53:14

标签: bash shell multiprocessing execution

一切都在完美地执行。

words.dict文件每行包含一个单词:

$ cat words.dict
cat
car
house
train
sun
today
station
kilometer
house
away

chapter.txt文件包含纯文本:

$ cat chapter.txt
The cars are very noisy today.
The train station is one kilometer away from his house.

下面这个脚本在chapter.txt文件中添加了在word.ict文件中找不到的所有单词 grep 命令,使用10个并行 grep

$ cat psearch.sh
#!/bin/bash --
> result.txt
max_parallel_p=10
while read line ; do
  while [ $(jobs | wc -l) -gt "$max_parallel_p" ]; do sleep 1; done
  fgrep -q "$line" chapter.txt || printf "%s\n" "$line" >> result.txt &
done < words.dict
wait

测试:

$ ./psearch.sh
$ cat result.txt
cat
sun

我认为测试会在result.txt

中生成混合词
csat
un

但它似乎确实有效。

请看一看并解释原因?

1 个答案:

答案 0 :(得分:3)

后台作业不是线程。通过多线程进程,您可以获得该效果。原因是每个进程只有一个标准输出流(stdout)。在多线程程序中,所有线程共享相同的输出流,因此对stdout的无保护写入可能会导致您描述的乱码输出。但是你没有多线程程序。

当您使用&限定符时,bash会创建一个具有自己的stdout流的新子进程。通常(取决于实现细节),这是在换行符上刷新的。因此,即使文件可能是共享的,粒度也是一致的。

两个进程可能在同一时间刷新文件的可能性很小,但是您的代码(包括子进程和休眠)使其极不可能。

您可以尝试从printf中取出换行符,但考虑到其余代码和小数据集的效率低下,它仍然不太可能。每个过程很可能在下一次启动之前完成。