個人是小白,沒有學習之前,我的想法是這樣的:
第一種辦法,就是設置一個全局變量write_flag,當一個進程將結果寫入時,首先看看write_flag是否為True,如果為True,然后將write_flag重置為Flase,然后將結果寫入文件,然后將write_flag重置為True;
第二種辦法,使用Lock鎖,寫之前先lock.acquire(),寫完后lock.release();
第三種辦法,使用回調函數,callback表示一個單參數的方法,當有結果返回時,callback方法會被調用,參數即為任務執行后的結果
然后自己一通瞎寫, 結果第一種方法pycharm中執行起來還行,但是打包出來的話,在windows上執行會出問題;接着試第二種方法,pycharm中執行起來還行,但是打包出來的話,執行會出問題;接着試第三種方法,pycharm中執行起來還行,但是打包出來的話,執行會出問題;
什么問題呢?
運行exe,啟動無數個主程序,導致系統無法使用!!!!
在進程中能看到,啟動了很多進程,遠遠多於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)對象
這都是啥意思?
然后,然后就不知道問題出在哪里了…………
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']
待續…………
