跳转到主要内容

用于在多个输入上运行程序的工具

项目描述

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

它针对“中等规模”的实验进行了优化,这些实验规模太小且过于临时,无法在适当的集群上运行(或者也许您根本就没有适当的集群。我没有),但足够慢,以至于从头开始重新启动它们会非常痛苦,理想情况下,并行性足够高,如果您恰好有一个十六核心的服务器可以运行它们,您真的希望使用所有十六个核心。

each的主要用途是以下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"

除了更短、更易读外,使用each编写此代码还能得到

  1. 自动并行化。您可以使用--processes=n来控制运行多少个进程,但默认情况下将使用除了一个之外的所有可用核心(或在单核机器上的一个核心)。

  2. 自动恢复 - 如果each崩溃,当它下次启动时,它将从上次停止的地方恢复。

  3. 进度反馈,以及关于进程何时完成的良好预测分析(仍在进行中,但基本功能已经实现)。

稍后您还将获得良好的错误重试逻辑,但我还没有编写这部分。

each还处于早期阶段,因此可能有一些粗糙的边缘,但它经过良好测试,并且已经使我的生活大大改善。

用法

用法如下

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

命令可以是任意shell命令(默认情况下将通过$SHELL -c '要运行的一些命令'来运行)。

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

更高级的用法选项可在每个 --help 中找到。

常见问题解答

为什么?

我有许多实验,基本上是“在每个这些文件上运行这个长时间运行的任务”,任务有不同程度的不可靠性,而我总是发现自己写出不好的版本,所以我决定一次性解决这个问题。

与bash循环版本相比的主要特点

  1. 你不会冒学习更多bash的风险。

  2. 如果你将其终止,它会从上次停止的地方继续。

  3. 自动并行处理

  4. 你将获得一个酷炫的进度条。

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

我该如何安装它?

pip install each

它运行在什么平台上?

可能是在任何类Unix平台上。我已在Linux(包括WSL,Windows 10 Linux子系统)上开发和测试过它,但它可能在未修改的情况下在OSX上运行。它不太可能在Windows上运行。我不反对有人贡献Windows支持,但我不打算自己编写,这是一个相当类Unix的工具。

我应该使用这个吗?

嗯,可能吧。我发现它非常有帮助,但可能非常符合我的使用习惯。

如果你尝试它但不起作用,请提交一个问题或提交一个PR。我很高兴它对大家都有用,但我不会投入大量时间来支持它。

你会使其在Python 2上运行吗?

不会。

你会以更宽松的许可证发布它吗?

也不会。

我不喜欢这些答案。我应该使用什么替代方案?

我不知道。也许bashreduce

项目详情


下载文件

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

源代码分发

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

源代码

由以下支持