【发布时间】: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