【发布时间】:2021-12-31 12:55:39
【问题描述】:
我正在研究如何使用多线程来处理任务。我注意到fifo文件可以帮助解决这个问题。效果如下:
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
exec 7<>$ff
for i in {1..10};do echo;done >&7
for i in {1..1000};do {
read -u 7
my_cmd $i
echo >&7
}& done
rm $ff
wait
echo "end"
这个shell脚本可以正常运行(处理1000个cmd,一次10个)。我稍微修改了这个脚本
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
exec 7<>$ff
for i in {1..10};do echo;done >$ff # modified
for i in {1..1000};do {
read <$ff # modified
my_cmd $i
echo >$ff # modified
}& done
wait
rm $ff
echo "end"
果然,第二个脚本也可以正常运行了。但是我再次修改时出错了。
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
# exec 7<>$ff modified
for i in {1..10};do echo;done >$ff
for i in {1..1000};do {
read <$ff
my_cmd $i
echo >$ff
}& done
wait
rm $ff
echo "end"
脚本等待对fifo文件的输入,因为fifo文件进入了阻塞状态。似乎这个命令'exec 7$ff'解除了这个fifo文件的阻塞状态。那么是这样吗?
【问题讨论】:
标签: multithreading shell exec mkfifo