記一次多進程的寫入同一個文件的方法

我的是小白,沒有學習以前,個人想法是這樣的:數據庫

第一種辦法,就是設置一個全局變量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']

 

 

 

待續…………

相關文章
相關標籤/搜索