问题是您将可以运行taskset
的 CPU 限制为 4 个 CPU。parallel
我相当确定 的子进程parallel
、它的每个实例my_bash_script.sh
及其启动的 Python 进程也将继承同一组 CPU 关联性,因此它们也将能够在您指定的 4 个 CPU 中的任何一个上运行。
我认为,您想要的是将启动的每个 Python 进程限制parallel
在不同的 CPU 上,您可以通过taskset
将my_bash_script.sh
. 具体来说,不要限制parallel
运行位置,而是限制它启动的 Python 进程可以运行的位置,方法是将调用包装python
在my_bash_script.sh
with 中taskset
。您将一个数字传递给每个调用,my_bash_script.sh
以便您可以使用它来为每个python
调用计算不同的 CPU(当前您可以使用(($1 - 1))
,因为您传入值 1 - 4 但如果您有更多,您需要值 mod 4 或其他东西)。
请注意,我所描述的应该有效,但并不完美。假设您在 CPU 1 上运行进程 1,在 CPU 2 上运行进程 2,等等。如果进程 1 先完成,则没有任何东西在使用 CPU 1,也没有任何东西会使用 CPU 1,因为您已将其他进程限制为每个 CPU 1 个。理想情况下,您希望他们能够接管现在空闲的 CPU,但这更复杂。
编辑:@Ole Tang 上面的回答建议使用{%}
作业槽,而不是根据您提交任务的顺序将任务分配给 CPU,这有助于(但不能消除)我上面描述的问题。
我想知道你为什么要将它们限制为每个 1 个 CPU。确实,如果同时运行许多线程,内核将尝试对它们进行时间切片以给每个线程平等的资源,这实际上会由于上下文切换、缓存冲突等而损害性能。 OTOH,如上所述,替代方案至少在某些时候可能会让一些 CPU 处于空闲状态,这并不明显最终会给您带来更好的性能。