gpt4 book ai didi

multithreading - 使用 bash 进行多线程

转载 作者:行者123 更新时间:2023-12-02 14:37:46 25 4
gpt4 key购买 nike

它可能看起来很危险,但任务非常简单:

服务器具有以下目录结构:

/usr/multi
/1
job
file.a
file.b
/2
job
file.a
file.b
/3
job
file.a
file.b

以及以下代码:
#this is thread.sh
cd /usr/multi
#find the first directory that has a job file
id=$(ls */job)
#strip everything after "/" ("1/job" becomes "1")
id=${id%%/*}
#read job
read job <$id/job
if [ "$id" == "" ] || [ "$job" == "" ]
then
false
else
#mark that id as busy
mv $id/job $id/_job
#execute the job
script.sh $1 $job
#mark that id as available
mv $id/_job $id/job
fi
script.shjob 执行一些操作(在 file.a 文件和接收的参数中描述)和 file.b .

另一方面,客户端执行以下代码:
#loop infinitely on failure, break loop on success
false
while [ "$?" != "0" ]
do
result=$(ssh $server "thread.sh 'some instructions'" </dev/null)
done
echo $result

所以每个客户都会得到一个单独的 id并给服务器 some instructions执行 job指定为 id .如果服务器上的客户端多于可用作业,客户端将继续尝试获取第一个可用的 id当他们这样做时,给 some instructions到服务器执行相应的 job .

问题是每隔一段时间就有两个客户端得到相同的 id。 ;和 thread.sh搞砸了 file.afile.b .

我的理论是当两个客户请求 id 时会发生这种情况。几乎同时来自服务器,因此服务器无法重命名 job文件的速度足以让一位客户看到它可用,而另一位客户则认为它很忙。

我应该在 if [ "$id" == "" ] || [ "$job" == "" ] 之前放置随机 sleep 间隔吗?所以我会在时间上得到更多的随机性?

最佳答案

正如您已经正确确定的那样,您的脚本相当 racy .

可以使用 bash 中的简单锁定来实现

set -o noclobber

并写入锁定文件。如果锁已被持有(文件存在),您的写入尝试将以原子方式失败。

关于multithreading - 使用 bash 进行多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com