使用与if __name__ =='__ main__'相关的python-multiprocessing的谜

时间:2014-08-29 14:59:34

标签: python multiprocessing pool

我正在使用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)

完美无缺。

有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:2)

在第二个中,my_concat(work_path)位于if语句内,因此仅在脚本作为主脚本运行时执行。

首先,my_concat(work_path)位于if语句之外。当multiprocessing在新的Python会话中导入模块时,它不会以__main__导入,而是以其自己的名称导入。因此,当您的模块导入到该流程中时,此语句将立即在您的每个池的流程中立即运行。