我将在前言中说我是并行处理的新手。努力变得更好,但我找不到我的问题的答案,这似乎是相当独特的。
我遇到了这段代码的问题:
from joblib import Parallel
import multiprocessing
n_cores = multiprocessing.cpu_count()
Parallel(n_jobs=n_cores)(delayed(blexon)(gene,genomes) for gene in genes)
'基因'和'基因组'是字符串列表。在我的基因列表中,我可以拥有数百个基因。我正在使用Parallel来对所有这些基因运行这个过程,这是有效的!如果您认为基因与集合同时运行,那么对于前几个“集合”,我可以使用计算机的所有核心。但是,在几组之后,程序只使用一个核心。如果我有12个核心,12个基因将同时运行几次迭代,但在某些时候,只有一个基因会运行。
我发现有关Parallel的信息只使用了一个scipy核心(我在这个脚本中使用),但这是一种奇怪的行为:它在切换到使用单个核心之前暂时使用所有核心。
我不确定如何解决这个问题。有人有任何意见吗?
谢谢。
系统: Ubuntu 16.04 LTS Python 3.5.2 joblib 0.9.4
--- --- EDIT
以下是我用来尝试解决cpu亲和性问题的一些代码:
p = psutil.Process(os.getpid())
print(p.cpu_affinity())
p.cpu_affinity(range(multiprocessing.cpu_count()))
print(p.cpu_affinity())
输出:(此计算机有12个核心)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- 编辑 -
在程序运行时观察htop(每次迭代可能需要几分钟)后,我发现内核数量逐渐减少。我开始使用12个内核,在此设置之后,我将并行运行11个内核。