Bash中的多线程

Kir*_*ran 74 linux bash shell multithreading

我想在我的shell脚本中介绍多线程功能.

我有一个脚本,read_cfg()用不同的参数调用该函数.每个函数调用都是独立的.

是否可以并行地实例化这些函数调用(而不是脚本).请让我怎样才能实现这一目标..?

Mar*_*tin 159

当然,只需&在命令后添加:

read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait
Run Code Online (Sandbox Code Playgroud)

然后,所有这些工作将同时在后台运行.然后,可选wait命令将等待所有作业完成.

每个命令都将在一个单独的进程中运行,因此从技术上讲它不是"多线程",但我相信它可以解决您的问题.

  • @TomTom:我当然知道进程和线程之间的区别.如果你看到OP的选择,我相信他只是在询问是否可以并行运行命令(这是可能的).我添加了一个关于此的说明以澄清. (34认同)
  • 您应该阅读进程和线程之间的区别.你建议的不是多线程 - 它涉及每个命令的单独进程. (7认同)

tno*_*rgd 26

您可以并行运行脚本的多个副本,每个副本用于不同的输入数据,例如,处理4个核心上的所有*.cfg文件:

    ls *.cfg | xargs -P 4 -n 1 read_cfg.sh
Run Code Online (Sandbox Code Playgroud)

read_cfg.sh脚本只接受一个参数(由-n强制执行)

  • 只是注意你应该指定`read_cfg.sh`或`xargs`的完整路径会说它找不到文件. (2认同)
  • 最好使用 `printf '%s\0' *.cfg | xargs -0 ...` -- 这样就可以处理带有空格、不可打印字符等的文件名。另见 [为什么你不应该解析 ls(1) 的输出](http://mywiki.wooledge.org /ParsingLs)。 (2认同)

mou*_*iel 21

Bash作业控制涉及多个进程,而不是多个线程.

您可以在后台执行带&后缀的命令.

您可以使用该wait命令等待后台命令的完成.

您可以通过将它们分开来并行执行多个命令|.这也提供了同步机制,因为左边的命令的stdout |连接到右边的命令的stdin.