[英]python multiprocessing on windows, 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.