我正在使用multiprocessing
来加速我的程序,并且有一个我无法解决的谜。
我正在使用multiprocessing
用函数writing_sub_file
编写很多短文件(基于很多输入文件),最后在所有进程结束后连接所有这些文件,使用函数my_concat
。这是两个代码示例。请注意,此代码位于我的main .py
文件中,但函数my_concat
是从另一个模块导入的。第一个:
if __name__ == '__main__':
pool = Pool(processes=cpu_count())
arg_tuple = (work_path, article_dict, cat_len, date_to, time_period, val_matrix)
jobs = [(group, arg_tuple) for group in store_groups]
pool.apply_async(writing_sub_file, jobs)
pool.close()
pool.join()
my_concat(work_path)
它会产生很多错误(与池中的进程一样多),因为它尝试在我的所有进程完成之前应用my_concat
(我不会给出错误的堆栈,因为它是非常清楚my_concat
函数在池进程写入每个文件之前尝试应用。)
第二个:
if __name__ == '__main__':
pool = Pool(processes=cpu_count())
arg_tuple = (work_path, article_dict, cat_len, date_to, time_period, val_matrix)
jobs = [(group, arg_tuple) for group in store_groups]
pool.apply_async(writing_sub_file, jobs)
pool.close()
pool.join()
my_concat(work_path)
完美无缺。
有人可以解释一下原因吗?
答案 0 :(得分:2)
在第二个中,my_concat(work_path)
位于if
语句内,因此仅在脚本作为主脚本运行时执行。
首先,my_concat(work_path)
位于if
语句之外。当multiprocessing
在新的Python会话中导入模块时,它不会以__main__
导入,而是以其自己的名称导入。因此,当您的模块导入到该流程中时,此语句将立即在您的每个池的流程中立即运行。