首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Bash中并行运行给定的函数?

如何在Bash中并行运行给定的函数?
EN

Stack Overflow用户
提问于 2013-06-26 05:24:27
回答 3查看 32.7K关注 0票数 33

有一些类似的问题,但我的问题不是“并行运行多个程序”-这可以用parallelxargs简单地完成。

我需要并行化Bash函数。

让我们想象一下这样的代码:

代码语言:javascript
运行
复制
for i in "${list[@]}"
do
    for j in "${other[@]}"
    do
    # some processing in here - 20-30 lines of almost pure bash
    done
done

有些处理需要调用外部程序。

我想运行一些(4-10)个任务,每个任务运行不同的$i。$list中的元素总数大于500。

我知道我可以把整个for j ... done循环放在外部脚本中,然后并行调用这个程序,但是有没有可能不在两个单独的程序之间拆分功能呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-26 09:14:44

编辑:请考虑使用Ole's answer

您可以将代码放在单独的bash函数中,而不是单独的脚本。然后,您可以导出它,并通过xargs运行它:

代码语言:javascript
运行
复制
#!/bin/bash
dowork() { 
    sleep $((RANDOM % 10 + 1))
    echo "Processing i=$1, j=$2"
}
export -f dowork

for i in "${list[@]}"
do
    for j in "${other[@]}"
    do
        printf "%s\0%s\0" "$i" "$j"
    done
done | xargs -0 -n 2 -P 4 bash -c 'dowork "$@"' -- 
票数 19
EN

Stack Overflow用户

发布于 2013-06-26 17:27:35

semGNU Parallel的一部分,是为这种情况而设计的。

代码语言:javascript
运行
复制
for i in "${list[@]}"
do
    for j in "${other[@]}"
    do
        # some processing in here - 20-30 lines of almost pure bash
        sem -j 4 dolong task
    done
done

如果你更喜欢这个功能,GNU Parallel可以一次完成dual for循环:

代码语言:javascript
运行
复制
dowork() { 
  echo "Starting i=$1, j=$2"
  sleep 5
  echo "Done i=$1, j=$2"
}
export -f dowork

parallel dowork ::: "${list[@]}" ::: "${other[@]}"
票数 51
EN

Stack Overflow用户

发布于 2018-01-12 02:48:12

并行运行多行命令的解决方案:

代码语言:javascript
运行
复制
for ...your_loop...; do
  if test "$(jobs | wc -l)" -ge 8; then
    wait -n
  fi

  {
    any bash commands here
  } &
done
wait

在您的案例中:

代码语言:javascript
运行
复制
for i in "${list[@]}"
do
  for j in "${other[@]}"
  do
    if test "$(jobs | wc -l)" -ge 8; then
      wait -n
    fi

    {
      your
      multi-line
      commands
      here
    } &
  done
done
wait

如果已经有8个bash作业在运行,wait将等待至少一个作业完成。如果/当作业较少时,它将异步启动新作业。

此方法的优点:

  1. 多行命令非常简单。你的所有变量都会在作用域中被自动“捕获”,不需要将它们作为参数传递,
  2. 这是相对较快的。例如,将其与parallel进行比较(我引用的是官方man):

parallel在启动时很慢--第一次大约是250ms,之后是150ms。

  1. 只需要bash即可工作。

缺点:

  1. 当我们计算它们时,有可能有8个工作,但当我们开始等待时,可能会更少。(如果作业在两个命令之间的毫秒内完成,就会发生这种情况。)这会使我们的wait拥有比所需的更少的工作。但是,它将在至少一个作业完成时恢复,或者如果有0个作业正在运行,则立即恢复(在这种情况下,wait -n会立即退出)。
  2. 如果在同一个bash脚本中已经有一些命令异步运行(&),则循环中的工作进程会更少。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17307800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档