Bash中的多线程[重复]

Posted

技术标签:

【中文标题】Bash中的多线程[重复]【英文标题】:Multithreading in Bash [duplicate] 【发布时间】:2011-01-26 10:05:45 【问题描述】:

我想在我的 shell 脚本中引入多线程功能。

我有一个脚本,它使用不同的参数调用函数read_cfg()。 这些函数调用中的每一个都是独立的。

是否可以并行实例化这些函数调用(不是脚本)。 请让我怎样才能做到这一点..?

【问题讨论】:

这不是多线程——它是多处理。每个实例都在不同的进程中运行,使用fork() 从原始进程中复制。这些进程——与线程不同——有自己的文件描述符表,它们的内存是写时复制的(所以当它们改变变量的值时,父进程看不到它)。 【参考方案1】:

好的,只要在命令后面加上&

read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait

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

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

【讨论】:

您应该阅读进程和线程之间的区别。您提出的不是多线程 - 它涉及每个命令的单独进程。 @TomTom:我当然知道进程和线程之间的区别。如果您看穿了 OP 的措辞,我相信他只是在询问是否可以并行运行命令(这是可能的)。我为此添加了一条注释以进行澄清。 如果你有大量进程可能会很慢【参考方案2】:

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

    ls *.cfg | xargs -P 4 -n 1 read_cfg.sh

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

【讨论】:

请注意,您应该指定read_cfg.sh 的完整路径,否则xargs 会说找不到文件。 最好使用printf '%s\0' *.cfg | xargs -0 ...——这样可以处理带有空格、不可打印字符等的文件名。另见Why you shouldn't parse the output of ls(1)。【参考方案3】:

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

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

您可以使用wait 命令等待后台命令完成。

您可以通过用| 分隔多个命令来并行执行多个命令。这也提供了一种同步机制,因为| 左侧命令的标准输出连接到右侧命令的标准输入。

【讨论】:

以上是关于Bash中的多线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对 C# 循环中的多线程感到困惑 [重复]

sh BASH中域可用性的多线程检查程序

Python中的多线程并行运行

Junit测试具有数据库访问权限的多线程应用程序[重复]

VB中的多线程

python中的多线程