如何在Python中运行多处理池代码而不提及__main__环境

u5rb5r59  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(152)

当我在main环境中运行Python的多处理池时,我得到了预期的输出,即由于并行处理而减少了时间。
但是当我在没有main环境的情况下运行相同的代码时,它只会抛出错误

from multiprocessing import Pool
import os
import time

def get_acord_detected_json(page_no):
    time.sleep(5)
    return page_no*page_no

def main():
    n_processes = 2
    page_num_list = [1,2,3,4,5]
    print("n_processes : ", n_processes)
    print("page_num_list : ", page_num_list)
    print("CPU count : ", os.cpu_count())
    t1 = time.time()
    with Pool(processes=n_processes) as pool:
        acord_js_list = pool.map(get_acord_detected_json, page_num_list)

    print("acord_js_list : ", acord_js_list)
    t2 = time.time()
    print("t2-t1 : ", t2-t1)

if __name__=="__main__":
    main()

输出量:

n_processes :  2
page_num_list :  [1, 2, 3, 4, 5]
CPU count :  8
acord_js_list :  [1, 4, 9, 16, 25]
t2-t1 :  15.423236846923828

但当我这样做

main()

代替

if __name__=="__main__":
    main()

我收到不间断的错误日志(崩溃日志)

qjp7pelc

qjp7pelc1#

当Python启动一个辅助的多处理进程时,它会在每个进程的空间中再次导入脚本。(我使用的是Windows,这总是正确的,但根据文档,在其他操作系统上不一定如此。)这甚至适用于进程池,这就是你正在使用的。
在这些额外的导入过程中,__name__局部变量不是__main__。因此,您可以将希望在每个子进程中运行的代码与只希望运行一次的代码分开。这就是if __name__ == "__main__"语句的用途。
当您运行脚本而省略此语句时,模块会在每个子进程中反复加载。(),然后尝试启动更多的子进程,再尝试启动更多的子进程,如此类推。正如您所观察到的那样,整个过程崩溃了。()函数只运行一次,在它正常工作的主进程中,启动所有其他进程。
恐怕你只能写那一行代码了。生活中充满了令人不快的必需品。但这可能比把所有东西都切换到另一个操作系统的破坏性要小。
另请参阅python multiprocessing on windows, if name == "main"
不幸的是,标准的python库文档将这个问题作为必须遵守的戒律而不是可以理解的解释(在我看来)。

相关问题