Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中的多进程队列_Bash_Shell_Queue_Fifo - Fatal编程技术网

Bash中的多进程队列

Bash中的多进程队列,bash,shell,queue,fifo,Bash,Shell,Queue,Fifo,Bash中多进程队列的良好实现是什么 我考虑使用FIFO,每一行代表队列中的一个元素: mkfifo fifo ls > fifo 在不同的过程中: read element < fifo 预期结果是读卡器进程读取一行i。E一个元素并将其存储在变量$element中,保持队列的其余部分不变,以便其他读取器进程也可以获取元素行 不幸的是,这不起作用。read语句打开FIFO,导致写入程序ls立即完成,关闭FIFO似乎会导致其余数据丢失,其他元素无法被另一个进程读取事实上,下一次读取

Bash中多进程队列的良好实现是什么

我考虑使用FIFO,每一行代表队列中的一个元素:

mkfifo fifo
ls > fifo
在不同的过程中:

read element < fifo
预期结果是读卡器进程读取一行i。E一个元素并将其存储在变量$element中,保持队列的其余部分不变,以便其他读取器进程也可以获取元素行

不幸的是,这不起作用。read语句打开FIFO,导致写入程序ls立即完成,关闭FIFO似乎会导致其余数据丢失,其他元素无法被另一个进程读取事实上,下一次读取 我还考虑过以编写器的身份触摸特殊目录中的文件,并以读卡器的身份将文件移开,但这似乎很乏味,显然对于数百万队列条目来说是不可行的

我能让FIFO变体以某种方式工作吗


有没有一种不同的方法来实现shell队列,让多个writer和多个reader都在同一个队列上工作?

您只需要保持管道打开即可

$mkfifo PIPE
$cat > PIPE &
管道现在无限期地打开,直到你杀死猫为止

$ls > PIPE &
$read Line < PIPE
$echo $Line
 file1

你现在可以随心所欲地写作和阅读了。

我自己可能已经找到了答案。我使用的不是FIFO,而是一个简约的TCP服务器,它接受来自一个端口的输入,并将输出逐行写入另一个端口

要设置TCP服务器,我使用以下脚本:

nc -k -l 4444 | while read a
  do echo "$a" | nc -l 4445
done
Append&当然可以在后台运行它

然后作者可以做这样的事情:

for ((i=0; i<10000; i++))
do
  printf "x%02d\n" "$i"
done >/dev/tcp/127.0.0.1/4444
while ! { read a < /dev/tcp/localhost/4445; } 2>/dev/null
do
  sleep 2  # we poll; if there is nothing, we sleep between polls
done
echo "$a"
读者可以这样做:

for ((i=0; i<10000; i++))
do
  printf "x%02d\n" "$i"
done >/dev/tcp/127.0.0.1/4444
while ! { read a < /dev/tcp/localhost/4445; } 2>/dev/null
do
  sleep 2  # we poll; if there is nothing, we sleep between polls
done
echo "$a"
这个脚本获取一个元素行并处理它,echo$a。如果要排空队列,请在循环中执行此操作


我对轮询解决方案不太满意,但测试表明它可以可靠地与两个编写器和两个读卡器一起工作,我不明白为什么更多的读卡器和编写器会带来问题。

我不确定您想要在shell和fifo中实现的内容是否琐碎和清晰。即使考虑到你可能会一直打开管道,这样它就不会丢失数据,如123所说,管道缓冲区的大小实际上并不适合数百万个队列条目,因此如果读卡器速度慢且写入速率大,你会丢失数据,如果需要同步读卡器可能会很痛苦。我也有同样的印象。在我的测试中,我遇到读者阅读了一行的一部分,而另一位读者阅读了该行的其余部分,这种情况很少见,但也经常发生。我不知道如何避免这种情况。但也许有一种标准的工具,比如一个小型的服务器进程,它可以充当一个队列,从编写者那里获取数据并分发给读者。我只是碰巧不知道这样一个工具。这似乎只适用于最小的示例,但我的ls更复杂,当然,e。G对于i=0;i@Alfe这个循环对我有效,你是如何运行它/写入管道的?我的作者尝试了这个:cat>fifo&catpid=$!;对于i=0;i fifo&当读卡器执行此操作时,它会死于SIGPIPE:declare-ic;c=0;而睡眠0.1美元随机;一定要读