2010-03-11 52 views
60

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

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

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

+0

这不是多线程 - 这是多。每个实例都运行在一个独特的过程中,用'fork()'从原始复制过来。这些进程 - 与线程不同 - 具有它们自己的文件描述符表,并且它们的内存是写入时拷贝(因此,当它们更改变量的值时,父进程不会看到它)。 – 2016-09-21 22:48:47

回答

127

当然,只是添加&指令后:

read_cfg cfgA & 
read_cfg cfgB & 
read_cfg cfgC & 
wait 

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

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

+6

您应该读取进程和线程之间的区别。你提出的不是多线程 - 它涉及每个命令的单独进程。 – TomTom 2010-03-11 14:56:00

+24

@TomTom:我当然知道进程和线程之间的区别。如果你看到OP的单词选择,我相信他只是问是否可以并行运行命令(这是可能的)。我添加了一个关于此的说明来澄清。 – Martin 2010-03-11 14:59:44

19

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

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

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

您可以通过将它们与|分开来并行执行多个命令。这也提供了同步机制,因为在|左边的命令的标准输出连接到右边的命令标准输出。

23

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

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

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

+2

只是一个说明,你应该指定'read_cfg.sh'或'xargs'的完整路径将会说它找不到该文件。 – Jeshurun 2013-07-16 10:22:14

+0

更好地使用'printf'%s \ 0'* .cfg | xargs -0 ...' - 这种方式适用于带有空格,不可打印字符等的文件名。另请参阅[为什么不应该解析ls(1)的输出](http://mywiki.wooledge.org/ParsingLs)。 – 2016-09-21 22:49:28