我需要并行运行 python 脚本几次,但我已经像这样在后台执行它
ipython program.py & ipython program.py & ...
我想知道这种方式每次执行是否使用一个核心,或者只是使用线程执行program.py。顺便说一句,我想探索 GNU Parallel 的使用,但我找到的示例是关于“find”的“cat”之类的命令。如何使用 GNU Parallel 每次在不同的核心中同时执行 program.py?感谢您的帮助。
答案1
如何使用 GNU Parallel 每次在不同的核心中同时执行 program.py?
您(几乎)永远不想将程序与某个核心挂钩。通常您并不关心哪个核心正在执行这项工作。通常您只想为系统中的每个 CPU 线程运行一项作业。
和那使用 GNU Parallel 很容易做到:
seq 1000 | parallel ipython program.py
这将运行ipython program.py 1
..,ipython program.py 1000
但每个 CPU 线程仅并行运行一个作业。因此,在具有超线程(即 16 个 CPU 线程)的 8 核计算机上,它将并行启动 16 个作业。
这在第 2 章中有所介绍https://doi.org/10.5281/zenodo.1146014我鼓励您花 15 分钟阅读。你的命令行会因此而喜欢你。
答案2
我想知道这种方式每次执行是否使用一个核心
不,不一定,
或者只是使用线程执行program.py
不,这些是分开的流程, 不是线程。线程也可以安排在相同或不同的内核上。
所以,你似乎混淆了一些术语。
当你启动进程时你的操作系统会做什么日程它们,这意味着当有可用的 CPU 核心时,它们会在空闲的 CPU 核心上执行。这非常聪明,所以很可能您的不同 python 进程将在不同的内核上运行 - 但不一定(如果您只有 1 个内核,这也同样有效!)。
如何使用 GNU Parallel 每次在不同的核心中同时执行 program.py?
完全不是,这不是多处理器调度的工作原理(无需经历核心固定等技巧),并且很可能没有任何优势:如果您的程序尚未按照您调用它们的方式充分利用您的 CPU 核心, GNU 的相似之处不会改变这一点。如果不是所有核心都自动使用,则意味着您的进程正在竞争其他资源多于CPU时间。
例如,很可能它们相对存储带宽密集,因为您似乎正在使用 ipython (它加载了许多您不需要的 Python 模块,除非您实际上以交互方式运行,但您不能,因为你正在并行启动它们)而不是普通的Python。
一般来说,我发现 GNUparallel
相当笨拙,即不必要地难以使用。我发现这是并行启动 3 个三个进程( 、和)echo argument1 argument2 argument3 | xargs -P0 -n1 python script.py
的更简单的方法。python script.py argument1
python script.py argument2
python script.py argument3