Python多進程寫入同一文件的方法
最近用python的正則表達式處理了一些文本數(shù)據(jù),需要把結(jié)果寫到文件里面,但是由于文件比較大,所以運行起來花費的時間很長。但是打開任務(wù)管理器發(fā)現(xiàn)CPU只占用了25%,上網(wǎng)找了一下原因發(fā)現(xiàn)是由于一個叫GIL的存在,使得Python在同一時間只能運行一個線程,所以只占用了一個CPU,由于我的電腦是4核的,所以CPU利用率就是25%了。
既然多線程沒有什么用處,那就可以使用多進程來處理,畢竟多進程是可以不受GIL影響的。Python提供了一個multiprocessing的多進程庫,但是多進程也有一些問題,比如,如果進程都需要寫入同一個文件,那么就會出現(xiàn)多個進程爭用資源的問題,如果不解決,那就會使文件的內(nèi)容順序雜亂。這就需要涉及到鎖了,但是加鎖一般會造成程序的執(zhí)行速度下降,而且如果進程在多處需要向文件輸出,也不好把這些代碼整個都鎖起來,如果都鎖起來,那跟單進程還有什么區(qū)別。有一個解決辦法就是把向文件的輸出都整合到一塊去,在這一塊集中加個鎖,這樣問題就不大了。不過還有一種更加優(yōu)雅的解決方式:使用multiprocessing庫的回調(diào)函數(shù)功能。
具體思路跟把文件輸出集中在一起也差不多,就是把進程需要寫入文件的內(nèi)容作為返回值返回給惠和的回調(diào)函數(shù),使用回調(diào)函數(shù)向文件中寫入內(nèi)容。這樣做在windows下面還有一個好處,在windows環(huán)境下,python的多進程沒有像linux環(huán)境下的多進程一樣,linux環(huán)境下的multiprocessing庫是基于fork函數(shù),父進程fork了一個子進程之后會把自己的資源,比如文件句柄都傳遞給子進程。但是在windows環(huán)境下沒有fork函數(shù),所以如果你在父進程里打開了一個文件,在子進程中寫入,會出現(xiàn)ValueError: I/O operation on closed file這樣的錯誤,而且在windows環(huán)境下最好加入if __name__ == '__main__'這樣的判斷,以避免一些可能出現(xiàn)的RuntimeError或者死鎖。
下面是代碼:
from multiprocessing import Pool import time def mycallback(x): with open('123.txt', 'a+') as f: f.writelines(str(x)) def sayHi(num): return num if __name__ == '__main__': e1 = time.time() pool = Pool() for i in range(10): pool.apply_async(sayHi, (i,), callback=mycallback) pool.close() pool.join() e2 = time.time() print float(e2 - e1)
運行結(jié)果如下:
以上這篇Python多進程寫入同一文件的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實現(xiàn)對指定輸入的字符串逆序輸出的6種方法
這篇文章主要介紹了python實現(xiàn)對指定輸入的字符串逆序輸出的6種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04Python 切片索引越界的問題(數(shù)組下標(biāo)越界)
Python語言處理字符串、數(shù)組類的問題時有一定概率需要使用切片方法,本文主要介紹了Python 切片索引越界的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Python操作Access數(shù)據(jù)庫基本步驟分析
這篇文章主要介紹了Python操作Access數(shù)據(jù)庫基本步驟,結(jié)合實例形式詳細分析了Python針對access操作的具體步驟與相關(guān)注意事項,需要的朋友可以參考下2016-09-09用 Django 開發(fā)一個 Python Web API的方法步驟
這篇文章主要介紹了用 Django 開發(fā)一個 Python Web API的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python實現(xiàn)的MySQL增刪改查操作實例小結(jié)
這篇文章主要介紹了python實現(xiàn)的MySQL增刪改查操作,結(jié)合實例形式總結(jié)分析了Python基本的mysql增刪改查及銀行賬號查詢等相關(guān)操作實現(xiàn)技巧,需要的朋友可以參考下2018-12-12python實現(xiàn)PDF中表格轉(zhuǎn)化為Excel的方法
這篇文章主要為大家詳細介紹了python實現(xiàn)PDF中表格轉(zhuǎn)化為Excel的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06