我的是小白,沒有學習以前,個人想法是這樣的:數據庫
第一種辦法,就是設置一個全局變量write_flag,當一個進程將結果寫入時,首先看看write_flag是否爲True,若是爲True,而後將write_flag重置爲Flase,而後將結果寫入文件,而後將write_flag重置爲True;windows
第二種辦法,使用Lock鎖,寫以前先lock.acquire(),寫完後lock.release();app
第三種辦法,使用回調函數,callback表示一個單參數的方法,當有結果返回時,callback方法會被調用,參數即爲任務執行後的結果函數
而後本身一通瞎寫, 結果第一種方法pycharm中執行起來還行,可是打包出來的話,在windows上執行會出問題;接着試第二種方法,pycharm中執行起來還行,可是打包出來的話,執行會出問題;接着試第三種方法,pycharm中執行起來還行,可是打包出來的話,執行會出問題;學習
什麼問題呢?ui
運行exe,啓動無數個主程序,致使系統沒法使用!!!!spa
在進程中能看到,啓動了不少進程,遠遠多於pool中設置的processes數,什麼緣由呢?明明資料中介紹的是;調試
Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None) Returns a process pool object processes表示工做進程的個數,默認爲None,表示worker進程數爲cpu_count() initializer表示工做進程start時調用的初始化函數,initargs表示initializer函數的參數,若是initializer不爲None,在每一個工做進程start以前會調用initializer(*initargs) maxtaskperchild表示每一個工做進程在退出/被其餘新的進程替代前,須要完成的工做任務數,默認爲None,表示工做進程存活時間與pool相同,即不會自動退出/被替換。 函數返回一個進程池(Pool)對象
這都是啥意思?code
而後,而後就不知道問題出在哪裏了…………對象
1.問題描述:運行exe,啓動無數個主程序,致使系統沒法使用
緣由:在程序中使用了multiprocessing的包
解決辦法:在主文件if __name__ == "__main__":後,添加multiprocessing.freeze_support(),必定要在添加在最開始處
2. 問題描述:運行後,提示在freeze_support中sys.stdout.flush處異常
緣由:使用的PyQT做爲界面,沒有控制檯
解決辦法:在調用multiprocessing.freeze_support()前,重定向stdout和stderr,添加:sys.stdout = io.StringIO()和 sys.stderr = io.StringIO()
3.使用shelve模塊,IDE下調試能夠正常使用,打包後沒法使用
緣由:shelve 的 open 函數在運行中還會裝入其它的數據庫管理模塊,無從瞭解還須要哪些額外的包,故在打包時就漏掉了一些必要的模塊
解決辦法:修改打包腳本,添加以下內容:
packages = [] for dbmodule in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']: try: __import__(dbmodule) except ImportError: pass else: # If we found the module, ensure it's copied to the build directory. packages.append(dbmodule) options = { 'build_exe': { 'includes': 'atexit', "packages": packages } }
4.使用inspect.getsourcelines異常OSError: could not get source code
緣由:打包後,都是pyc文件,沒有源代碼,致使動態獲取代碼失敗
解決辦法:將包含所需源碼的py文件打包到library.zip文件中,在‘build_exe'參數中,增長'zip_includes':['path\\source.py']
待續…………