我不确定这是否更像是一个操作系统问题,但我想我会问这里,以防任何人从Python的结尾有一些见解.
我一直在尝试使用一个CPU密集型for循环joblib,但是我发现不是将每个工作进程分配给不同的核心,我最终将它们全部分配到同一个核心而没有性能提升.
这是一个非常简单的例子......
from joblib import Parallel,delayed
import numpy as np
def testfunc(data):
# some very boneheaded CPU work
for nn in xrange(1000):
for ii in data[0,:]:
for jj in data[1,:]:
ii*jj
def run(niter=10):
data = (np.random.randn(2,100) for ii in xrange(niter))
pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
...这是我在htop脚本运行时看到的内容:

我在一台4核的笔记本电脑上运行Ubuntu 12.10(3.5.0-26).显然joblib.Parallel是为不同的工作者生成单独的进程,但有没有办法让这些进程在不同的内核上执行?
我有两段代码,我用它来学习Python 3.1中的多处理.我的目标是使用所有可用处理器的100%.但是,此处的代码片段仅在所有处理器上达到30% - 50%.
无论如何'强制'python使用全部100%?操作系统(Windows 7,64位)是否限制了Python对处理器的访问?虽然下面的代码片段正在运行,但我打开任务管理器并观察处理器的峰值,但从未达到并维持100%.除此之外,我还可以看到在此过程中创建和销毁了多个python.exe进程.这些过程如何与处理器相关?例如,如果我生成4个进程,则每个进程都不使用它自己的核心.相反,使用的流程是什么?他们共享所有核心吗?如果是这样,操作系统是否迫使进程共享内核?
import multiprocessing
def worker():
#worker function
print ('Worker')
x = 0
while x < 1000:
print(x)
x += 1
return
if __name__ == '__main__':
jobs = []
for i in range(50):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
from multiprocessing import Process, Lock
def f(l, i):
l.acquire()
print('worker ', i)
x = 0
while x < 1000:
print(x)
x += 1
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(50):
Process(target=f, …Run Code Online (Sandbox Code Playgroud) 我想同时运行program.py的多个实例,同时限制同时运行的实例数(例如,我的系统上可用的CPU内核数).例如,如果我有10个内核并且总共需要运行1000次program.py,那么在任何给定时间只会创建并运行10个实例.
我已经尝试过使用多处理模块,多线程和使用队列,但在我看来似乎没有任何东西能够实现简单的实现.我遇到的最大问题是找到一种方法来限制同时运行的进程数.这很重要,因为如果我一次创建1000个进程,它就相当于一个fork炸弹.我不需要以编程方式从进程返回的结果(它们输出到磁盘),并且所有进程都彼此独立地运行.
任何人都可以给我一些建议或一个例子,说明如何在python中实现这一点,甚至是bash?我发布到目前为止我使用队列编写的代码,但它没有按预期工作,可能已经走错了路.
非常感谢.