Skip to main content

在许多输入上运行程序的工具

项目描述

每个都是一个 shell 命令,用于运行健壮的、并行的、具有良好反馈机制的 for 循环。

它针对“中等规模”实验进行了优化,这些实验有点太小而且是临时性的,无法在合适的集群上运行(或者你可能只是没有合适的集群。我没有),但是速度太慢以至于重新启动它们从头开始会很痛苦,而且理想情况下,足够并行,如果你碰巧有一个 16 核服务器在周围运行它们,你真的想使用所有 16 个核。

每个的主要用途是以下 bash for 循环的更健壮版本:

for f in "$source"/* ; do
    DEST="$destination"/$(basename $f)
    mkdir -p "$DEST"
    "$command" < "$f" > "$DEST/out" 2> "$DEST/err"
    echo $? > "$DEST/status"
done

可以使用 each 编写相同的内容,如下所示:

each "$source" "$command" --destination="$destination"

除了更短、更易读之外,用每个写这个可以让你:

  1. 自动并行。您可以使用--processes=n控制运行多少进程,但它默认使用除一个可用内核之外的所有内核(或单核机器上的一个内核)。

  2. 自动恢复 - 如果每个都死了,当它下次启动时,它将从停止的地方恢复。

  3. 对进度的反馈,以及对流程何时完成的良好预测分析(仍在进行中,但基础知识已经存在)。

稍后您还将获得重试错误的良好逻辑,但我还没有写那一点。

每个都还处于早期阶段,所以它可能有一些粗糙的边缘,但它经过了很好的测试,已经让我的生活变得更好了。

用法

用法是:

each some-input-directory 'some command to run' --destination="output directory"

命令可以是任意的 shell 命令(默认情况下将由$SHELL -c 'some command to run' 运行)。

默认情况下,文件的内容将被传递到子进程的标准输入。如果要按名称传递文件,可以使用特殊字符串{}。如果这样做,将用要处理的文件替换它(使用它的绝对路径名)并且 stdin 将为空。

每个--help都提供了更高级的使用选项。

常见问题

为什么?

我有一堆实验,基本上是“在每个文件上运行这个长时间运行的任务”,这些任务具有不同程度的脆弱性,我一直发现自己写的版本不好,所以我想我会解决这个问题一次并为所有人。

bash 循环版本的主要功能:

  1. 您不会冒险学习如何编写比您想要的更多的 bash。

  2. 如果你杀死它,它会从它停止的地方恢复。

  3. 自动并行

  4. 你会得到一个很酷的进度条。

  5. 当我开始编写更好的重试功能时,您将免费获得这些功能。

我该如何安装它?

pip install each

它在什么上运行?

可能是什么unixy。我已经在 Linux(包括 WSL,Windows 10 Linux 子系统)上开发和测试了它,但它很可能在未经修改的情况下在 OSX 上工作。它不太可能在 Windows 上运行。如果有人想贡献它,我不反对 Windows 支持,但我不会自己编写它,它是一种相当统一的工具。

我应该使用这个吗?

嗯,也许吧。我发现它很有帮助,但它可能对我的使用非常特殊。

如果您尝试了它但对您不起作用,请提出问题或进行 PR。我很高兴它普遍有用,但我不打算投入大量时间来支持它。

你会让它在 Python 2 上运行吗?

不。

你会在更宽松的许可下发布它吗?

也没有。

我不喜欢这些答案。我应该改用什么?

我不知道。也许bashreduce

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

each-0.0.6.tar.gz (10.9 kB 查看哈希)

已上传 source