繁体   English   中英

编写并行循环

[英]Writing a parallel loop

我试图在一个简单的例子上运行并行循环。
我究竟做错了什么?

from joblib import Parallel, delayed  
import multiprocessing

def processInput(i):  
        return i * i

if __name__ == '__main__':

    # what are your inputs, and what operation do you want to 
    # perform on each input. For example...
    inputs = range(1000000)      

    num_cores = multiprocessing.cpu_count()

    results = Parallel(n_jobs=4)(delayed(processInput)(i) for i in inputs) 

    print(results)

代码的问题在于,当在Python 3中的Windows环境下执行时,它会打开num_cores python实例来执行并行作业,但只有一个是活动的。 这不应该是这种情况,因为处理器的活动应该是100%而不是14%(在i7-8个逻辑核心下)。

为什么额外的实例没有做任何事情?

继续请求提供有效的多处理代码,我建议你使用pool_map (如果延迟功能并不重要),我会给你一个例子,如果你正在使用python3,值得一提的是你可以使用starmap 。 另外值得一提的是,如果返回结果的顺序不必与输入顺序相对应,则可以使用map_sync / starmap_async。

import multiprocessing as mp

def processInput(i):
        return i * i

if __name__ == '__main__':

    # what are your inputs, and what operation do you want to
    # perform on each input. For example...
    inputs = range(1000000)
    #  removing processes argument makes the code run on all available cores
    pool = mp.Pool(processes=4)
    results = pool.map(processInput, inputs)
    print(results)

在Windows上,多处理模块使用'spawn'方法启动多个python解释器进程。 这个比较慢。 并行尝试运行代码时要聪明。 特别是,它会尝试调整批量大小,因此批量执行大约需要半秒钟。 (参见https://pythonhosted.org/joblib/parallel.html上的batch_size参数)

您的processInput()函数运行得如此之快,以至于Parallel确定在一个处理器上串行运行作业比启动多个python解释器并并行运行代码更快。

如果要强制示例在多个核心上运行,请尝试将batch_size设置为1000或使processInput()更复杂,因此执行时间更长。

编辑:窗口上的工作示例,显示正在使用的多个进程(我正在使用Windows 7):

from joblib import Parallel, delayed
from os import getpid

def modfib(n):
    # print the process id to see that multiple processes are used, and
    # re-used during the job.
    if n%400 == 0:
        print(getpid(), n)  

    # fibonacci sequence mod 1000000
    a,b = 0,1
    for i in range(n):
        a,b = b,(a+b)%1000000
    return b

if __name__ == "__main__":
    Parallel(n_jobs=-1, verbose=5)(delayed(modfib)(j) for j in range(1000, 4000))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM