簡體   English   中英

使用python-multiprocessing與if __name__ =='__main__'相關的謎

[英]enigma using python-multiprocessing related with if __name__ == '__main__'

我正在使用multiprocessing來加快程序運行速度,並且有一個我無法解決的難題。 我正在使用multiprocessing來編寫帶有函數writing_sub_file的許多短文件(基於許多輸入文件),最后我在所有進程結束后使用函數my_concat將所有這些文件連接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函數會在嘗試應用之前先應用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__ ,它不會以__main__導入,而是以自己的名稱導入。 因此,當您將模塊導入到該進程時,該語句幾乎在池的每個進程中立即運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM