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中的多线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章