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


個人是小白,沒有學習之前,我的想法是這樣的:

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

 

 

 

待續…………


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM