Python 并行处理 - Linux 和 Windows 之间的不同行为

我试图让我的代码并行,但我遇到了一件我无法解释的奇怪事情。


让我定义上下文。我有一个非常繁重的计算要做,读取多个文件,对其进行机器学习分析,涉及很多数学。我的代码按顺序在 Windows 和 Linux 上正常运行,但是当我尝试使用多处理时,一切都会中断。下面是我首先在 Windows 上开发的示例:


from multiprocessing.dummy import Pool as ThreadPool 


def ppp(element):

    window,day = element

    print(window,day)

    time.sleep(5)

    return


if __name__ == '__main__'    

    #%% Reading datasets

    print('START')

    start_time = current_milli_time()

    tree = pd.read_csv('datan\\days.csv')

    days = list(tree.columns)

    # to be able to run this code uncomment the following line and comment the previous two

    # days = ['0808', '0810', '0812', '0813', '0814', '0817', '0818', '0827', '0828', '0829']

    windows = [1000]

    processes_args = list(itertools.product(windows, days))


    pool = ThreadPool(8) 

    results = pool.map_async(ppp, processes_args)

    pool.close() 

    pool.join() 

    print('END', current_milli_time()-start_time, 'ms')

当我在 Windows 上运行此代码时,输出如下所示:


START

100010001000 1000 1000100010001000      081008120808

08130814

0818

082708171000

1000    

  08290828


END 5036 ms

125 毫秒内的一组乱七八糟的打印。在 Linux 上也有相同的行为。但是,我注意到,如果我在 Linux 上应用此方法,并查看“htop”,我看到的是一组随机选择执行的线程,但它们从不并行执行。因此,经过一些谷歌搜索后,我想出了这个新代码:


from multiprocessing import Pool as ProcessPool


def ppp(element):

    window,day = element

    print(window,day)

    time.sleep(5)

    return

如您所见,我更改了导入语句,它基本上创建了一个进程池而不是线程池。这解决了 Linux 上的问题,实际上在真实场景中,我有 8 个处理器以 100% 运行,系统中有 8 个进程在运行。输出看起来像以前的那样。但是,当我在 Windows 上使用此代码时,整个运行需要 10 多秒的时间,而且,我没有得到任何ppp.


我真的试图寻找一个解释,但我不明白为什么会这样。例如这里:Windows 中的 Python 多处理池奇怪行为,他们讨论了Windows 上的安全代码,答案建议转向线程,作为副作用,这将使代码不是并行的,而是并发的。这里再举一个例子:Python multiprocessing linux windows差异。所有这些问题都描述fork()和spawn处理,但我个人认为我的问题不是这样。Python 文档仍然解释说 windows 没有fork()方法(https://docs.python.org/2/library/multiprocessing.html#programming-guidelines)。


总之,现在我确信我不能在 Windows 中进行并行处理,但我认为我从所有这些讨论中得出的结论是错误的。因此,我的问题应该是:是否可以在 Windows 中并行(在不同的 CPU 上)运行进程或线程?


Cats萌萌
浏览 300回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python