Bash中的多线程

113

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

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

是否可能并行实例化这些函数调用(而不是脚本)?请告诉我如何实现..?


2
这不是多线程,而是多进程。每个实例在一个独立的进程中运行,通过 fork() 从原始进程复制而来。这些进程 -- 不像线程 -- 有自己的文件描述符表,并且它们的内存是写时复制的(所以当它们改变变量的值时,父进程看不到)。 - Charles Duffy
3个回答

237
当然,只需在命令后添加&即可:
read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait

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

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


12
你应该了解进程和线程之间的区别。你提出的方案不是多线程——它涉及为每个命令创建独立的进程。 - TomTom
62
@TomTom:我肯定知道进程和线程的区别。如果你看透了OP选择的用词,我相信他只是在问是否可以并行运行命令(这是可能的)。我添加了一个说明以澄清这个问题。 - Martin
1
如果您有大量的进程,它可能会变得很慢。 - alexandre-rousseau

39

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

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

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


3
请注意需要指定read_cfg.sh的完整路径,否则xargs会提示找不到文件。 - Jeshurun
3
最好使用 printf '%s\0' *.cfg | xargs -0 ... -- 这样可以处理带有空格、不可打印字符等文件名。另请参阅 为什么不应该解析 ls(1) 的输出 - Charles Duffy

28

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

您可以使用&后缀将命令在后台执行。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接