我试图让我的代码并行,但我遇到了一件我无法解释的奇怪事情。让我定义上下文。我有一个非常繁重的计算要做,读取多个文件,对其进行机器学习分析,涉及很多数学。我的代码按顺序在 Windows 和 Linux 上正常运行,但是当我尝试使用多处理时,一切都会中断。下面是我首先在 Windows 上开发的示例:from multiprocessing.dummy import Pool as ThreadPool def ppp(element): window,day = element print(window,day) time.sleep(5) returnif __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 上运行此代码时,输出如下所示:START100010001000 1000 1000100010001000 0810081208080813081408180827081710001000 08290828END 5036 ms125 毫秒内的一组乱七八糟的打印。在 Linux 上也有相同的行为。但是,我注意到,如果我在 Linux 上应用此方法,并查看“htop”,我看到的是一组随机选择执行的线程,但它们从不并行执行。因此,经过一些谷歌搜索后,我想出了这个新代码:from multiprocessing import Pool as ProcessPooldef 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 上)运行进程或线程?
添加回答
举报
0/150
提交
取消