相关疑难解决方法(0)

为什么在导入numpy后多处理只使用一个核心?

我不确定这是否更像是一个操作系统问题,但我想我会问这里,以防任何人从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脚本运行时看到的内容:

HTOP

我在一台4核的笔记本电脑上运行Ubuntu 12.10(3.5.0-26).显然joblib.Parallel是为不同的工作者生成单独的进程,但有没有办法让这些进程在不同的内核上执行?

python linux numpy multiprocessing blas

121
推荐指数
3
解决办法
3万
查看次数

在多处理模块中使用100%的核心

我有两段代码,我用它来学习Python 3.1中的多处理.我的目标是使用所有可用处理器的100%.但是,此处的代码片段仅在所有处理器上达到30% - 50%.

无论如何'强制'python使用全部100%?操作系统(Windows 7,64位)是否限制了Python对处理器的访问?虽然下面的代码片段正在运行,但我打开任务管理器并观察处理器的峰值,但从未达到并维持100%.除此之外,我还可以看到在此过程中创建和销毁了多个python.exe进程.这些过程如何与处理器相关?例如,如果我生成4个进程,则每个进程都不使用它自己的核心.相反,使用的流程是什么?他们共享所有核心吗?如果是这样,操作系统是否迫使进程共享内核?

代码段1

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)

代码段2

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)

python multiprocessing python-3.x

44
推荐指数
4
解决办法
7万
查看次数

Python中的多处理,同时限制正在运行的进程数

我想同时运行program.py的多个实例,同时限制同时运行的实例数(例如,我的系统上可用的CPU内核数).例如,如果我有10个内核并且总共需要运行1000次program.py,那么在任何给定时间只会创建并运行10个实例.

我已经尝试过使用多处理模块,多线程和使用队列,但在我看来似乎没有任何东西能够实现简单的实现.我遇到的最大问题是找到一种方法来限制同时运行的进程数.这很重要,因为如果我一次创建1000个进程,它就相当于一个fork炸弹.我不需要以编程方式从进程返回的结果(它们输出到磁盘),并且所有进程都彼此独立地运行.

任何人都可以给我一些建议或一个例子,说明如何在python中实现这一点,甚至是bash?我发布到目前为止我使用队列编写的代码,但它没有按预期工作,可能已经走错了路.

非常感谢.

python multithreading multiprocessing

18
推荐指数
2
解决办法
1万
查看次数