Python 编写并行循环

Python 编写并行循环,python,windows,parallel-processing,joblib,Python,Windows,Parallel Processing,Joblib,我试图在一个简单的示例上运行并行循环。 我做错了什么 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 in

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

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环境下执行时,它会打开Python的
num_cores
实例来执行并行作业,但只有一个是活动的。这种情况不应该发生,因为处理器的活动应该是100%,而不是14%(在i7-8逻辑核下)


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

在Windows上,多处理模块使用“spawn”方法启动多个python解释器进程。这是相对缓慢的。Parallel试图在运行代码时变得聪明。特别是,它尝试调整批大小,使一个批执行大约需要半秒钟。(请参阅中的“批次大小”参数)

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

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

编辑:在windows上显示多个正在使用的进程的工作示例(我使用的是windows 7):


继续你的要求,提供一个工作的多处理代码,我建议你使用(如果延迟功能不重要),我会给你一个例子,如果你在python3上工作值得一提,你可以使用星图。 还值得一提的是,如果返回结果的顺序不必与输入的顺序相对应,则可以使用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)

您是否收到任何错误消息?它对我来说很好。缩进应该是4个空格而不是1个…我有同样的问题。问题是,代码只在一个内核上运行,而不是在n个内核上运行。您能否建议修改代码,以便有效地并行执行任务?由于上面的代码是作为joblib使用的示例给出的,因此应该有一个实际可行的示例。我喜欢它的简单性,所以我尝试了它。我得到一个TypeError:无法序列化'\u io.TextIOWrapper'对象。我的函数是复杂的,我没有时间深入研究它,只是一个评论,如果你有一个复杂的函数,这可能无法开箱即用。序列化是每个多进程程序的主要部分。为了尝试缓解这些问题,我建议检查您的复杂函数,检查它的哪些部分确实需要多处理解决方案,并尝试将其与复杂函数分离,这将简化序列化,甚至可能使其变得不必要。
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)