【问题标题】:In shellscript, how to use multiple cores? [duplicate]在shell脚本中,如何使用多核? [复制]
【发布时间】:2018-09-24 01:02:12
【问题描述】:

我运行一个非常简单的 shell 脚本,它对我每天下载的文件执行一些转换。通常它是一个包含六个文件的 zip 存档,然后我在将内容插入数据库之前分五个不同的步骤进行处理。第一步耗时 5-8 分钟/文件,受 CPU 限制。

我有两台计算机执行此任务,一台有两个内核,一台有四个内核和超线程。由于在我当前的设置中第一步需要 30 多分钟,我想多线程。

第一步基本上是

for file in *.txt
        dosomething "$file" "$file.csv"
done

在我的 2 核计算机上,我想并行处理两个文件,在我的 8 线程机器上,我想并行处理所有六个文件(如果存档包含 9 个文件的那一天可以处理就好了很好)。必须在下一步之前处理所有文件(这要快得多)。

如何启动合适数量的线程/进程,然后直到上一步完全完成才开始执行下一步?

【问题讨论】:

  • 通过parallel执行你想要的。
  • 你不需要线程。只需运行多个进程。
  • for file in *.txt; dosomethingh "$file" "$file.csv" & done
  • @DanielKamilKozar,这可能有点矫枉过正——parallel 需要安装 Perl 解释器;它的基本功能在 GNU xargs 的 -P 功能中提供,并且在许多情况下都不需要这些,因为 shell 本身可以创建和管理后台进程。
  • @CharlesDuffy:我运行的大多数系统都已经安装了 Perl,所以我从来没有注意到这一点。因此,parallel 已经成为我脑海中这种情况的首选想法。谢谢你的信息,我会记住的。

标签: multithreading shell


【解决方案1】:

Shell 脚本不是分配工作的好地方。从根本上说,它们只是调用一系列程序,这些程序本身可能使用也可能不使用多个内核。

您仍然可以通过在后台运行作业来实现一定程度的并行性(通过在命令后放置&)。这允许您的脚本在特定命令继续在后台运行时继续执行它想做的任何事情。之后运行wait 命令会强制您的脚本等待所有后台作业完成后再继续。

您还可以将各个命令的 PID 存储在一个数组中,并专门等待它们。 See this answer 了解有关如何正确执行此操作的更多详细信息。

对于您的用例,您可以检查可用内核的数量并在后台/等待那么多进程完成。你可以通过 grepping /proc/cpuinfo 来检查你有多少个内核:cat /proc/cpuinfo | grep -c processor

【讨论】:

  • 来自How to Answer,请参阅“回答正确提出的问题”部分,其中有关“...之前已经被多次询问和回答”的问题的要点。
  • 感谢您的回答。我知道 shell 真的不是一个多线程环境,但是由于我的脚本/任务非常简单,基本上只是在交互式 shell 中模拟用户,并且在手动执行这些命令时很容易“多线程”我觉得值得试一试!
猜你喜欢
  • 2012-01-09
  • 2017-12-20
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2020-11-01
  • 2019-04-29
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多