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

甜食

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)

完美地运作。

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

金德尔

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

首先,my_concat(work_path)是在if声明之外multiprocessing进口在新的Python会话的模块,它不是为进口__main__,但以自己的名义。因此,当您将模块导入到该进程时,该语句几乎立即在您池的每个进程中运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Python multiprocessing.Process中,我们是否必须使用`__name__ == __main__`?

如何使用 if __name__ == '__main__':

python if __name__ ==“ __main__”:IndentationError:预期为缩进块

将多个参数传递给 Python __name__=="__main__"

使用 if __name__ == "__main__" 从其他文件调用函数:

if __name__ ==“ __main__”的位置:

替代 if __name__ == '__main__':

使用IF __name__ ==“ __main__”语句从另一个python脚本运行python脚本

是否有C与Python等效:如果__name__ =='__main__':在文件顶部写入main()?

Python:如果__name__ =='__main__',则导入并初始化Argparse?

Python:如果__name__ =='__main__',则导入并初始化Argparse?

Pycharm“Python 控制台”中的 exec(open) 函数不执行“if __name__ == '__main__”块

在Python中调用getLogger之前,是否需要显式检查__name__ ==“ __main__”?

如果__name__ =='__main__',则相当于python的node.js

Python:命令行,sys.argv,“如果__name__ =='__main__'”

__name__ ==“ __main__”怎么办?

来自 if __name__ == "__main__" 的返回语句

如果__name__ =='__main__'函数调用

python manage.py shell <scripts / myscript.py在文件包含__name__ =='__main__'时不起作用

檢查調用腳本是否使用了“if __name__ ==”__main__”(以符合多處理要求)

为什么在__name__ ==“ __main__”下使用manage.py执行脚本时会运行两次

如何启动 __name__ == '__main__': 使用来自另一个 .py 文件的特定输入?

如果__name__ =='__main__'不起作用ipython

如果__name__ ==“ __main__”条件(带烧瓶/弹性豆茎)

如果在IPython中__name__ =='__main__'

如何测试或模拟“如果__name__ =='__main__'”内容

如何在“if __name__ == '__main__'”中模拟.patch 变量

为什么不将__name__ =='__main__'放在模块的开头?

在 Python 文件末尾添加 if __name__ == '__main__' 的用例是什么?将其添加到每个文件中是最佳做法吗?