Python多進(jìn)程寫入同一文件的方法
最近用python的正則表達(dá)式處理了一些文本數(shù)據(jù),需要把結(jié)果寫到文件里面,但是由于文件比較大,所以運(yùn)行起來花費(fèi)的時(shí)間很長(zhǎng)。但是打開任務(wù)管理器發(fā)現(xiàn)CPU只占用了25%,上網(wǎng)找了一下原因發(fā)現(xiàn)是由于一個(gè)叫GIL的存在,使得Python在同一時(shí)間只能運(yùn)行一個(gè)線程,所以只占用了一個(gè)CPU,由于我的電腦是4核的,所以CPU利用率就是25%了。
既然多線程沒有什么用處,那就可以使用多進(jìn)程來處理,畢竟多進(jìn)程是可以不受GIL影響的。Python提供了一個(gè)multiprocessing的多進(jìn)程庫(kù),但是多進(jìn)程也有一些問題,比如,如果進(jìn)程都需要寫入同一個(gè)文件,那么就會(huì)出現(xiàn)多個(gè)進(jìn)程爭(zhēng)用資源的問題,如果不解決,那就會(huì)使文件的內(nèi)容順序雜亂。這就需要涉及到鎖了,但是加鎖一般會(huì)造成程序的執(zhí)行速度下降,而且如果進(jìn)程在多處需要向文件輸出,也不好把這些代碼整個(gè)都鎖起來,如果都鎖起來,那跟單進(jìn)程還有什么區(qū)別。有一個(gè)解決辦法就是把向文件的輸出都整合到一塊去,在這一塊集中加個(gè)鎖,這樣問題就不大了。不過還有一種更加優(yōu)雅的解決方式:使用multiprocessing庫(kù)的回調(diào)函數(shù)功能。
具體思路跟把文件輸出集中在一起也差不多,就是把進(jìn)程需要寫入文件的內(nèi)容作為返回值返回給惠和的回調(diào)函數(shù),使用回調(diào)函數(shù)向文件中寫入內(nèi)容。這樣做在windows下面還有一個(gè)好處,在windows環(huán)境下,python的多進(jìn)程沒有像linux環(huán)境下的多進(jìn)程一樣,linux環(huán)境下的multiprocessing庫(kù)是基于fork函數(shù),父進(jìn)程fork了一個(gè)子進(jìn)程之后會(huì)把自己的資源,比如文件句柄都傳遞給子進(jìn)程。但是在windows環(huán)境下沒有fork函數(shù),所以如果你在父進(jìn)程里打開了一個(gè)文件,在子進(jìn)程中寫入,會(huì)出現(xiàn)ValueError: I/O operation on closed file這樣的錯(cuò)誤,而且在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)
運(yùn)行結(jié)果如下:

以上這篇Python多進(jìn)程寫入同一文件的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python多進(jìn)程分塊讀取超大文件的方法
- python多進(jìn)程實(shí)現(xiàn)文件下載傳輸功能
- Python實(shí)現(xiàn)的多進(jìn)程拷貝文件并顯示百分比功能示例
- python進(jìn)程池實(shí)現(xiàn)的多進(jìn)程文件夾copy器完整示例
- python實(shí)現(xiàn)批量修改文件名代碼
- Python遍歷目錄并批量更換文件名和目錄名的方法
- python實(shí)現(xiàn)批量改文件名稱的方法
- Python實(shí)現(xiàn)批量修改文件名實(shí)例
- Python多進(jìn)程并發(fā)(multiprocessing)用法實(shí)例詳解
- 淺析Python中的多進(jìn)程與多線程的使用
- python實(shí)現(xiàn)多進(jìn)程按序號(hào)批量修改文件名的方法示例
相關(guān)文章
python中字符串比較使用is、==和cmp()總結(jié)
在Python中比較字符串最好是使用簡(jiǎn)單邏輯操作符,今天為大家講解一下is、==和cmp()使用總結(jié)2018-03-03
python爬蟲_實(shí)現(xiàn)校園網(wǎng)自動(dòng)重連腳本的教程
下面小編就為大家分享一篇python爬蟲_實(shí)現(xiàn)校園網(wǎng)自動(dòng)重連腳本的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python3利用Dlib19.7實(shí)現(xiàn)攝像頭人臉識(shí)別的方法
這篇文章主要介紹了Python 3 利用 Dlib 19.7 實(shí)現(xiàn)攝像頭人臉識(shí)別 ,利用python開發(fā),借助Dlib庫(kù)捕獲攝像頭中的人臉,提取人臉特征,通過計(jì)算歐氏距離來和預(yù)存的人臉特征進(jìn)行對(duì)比,達(dá)到人臉識(shí)別的目的,感興趣的小伙伴們可以參考一下2018-05-05
PyTorch中flatten()?函數(shù)的用法實(shí)例小結(jié)
在PyTorch中,flatten函數(shù)的作用是將一個(gè)多維的張量轉(zhuǎn)換為一維的向量,它可以將任意形狀的張量轉(zhuǎn)換為一維,而不需要指定轉(zhuǎn)換后的大小,這篇文章主要介紹了PyTorch中flatten()?函數(shù)的用法,需要的朋友可以參考下2023-11-11
python循環(huán)控制之break和continue流程控制語(yǔ)句
這篇文章主要介紹了python循環(huán)控制之break流程控制語(yǔ)句,Python中提供了兩個(gè)關(guān)鍵字用來控制循環(huán)語(yǔ)句,分別是break和continue,本文都有介紹,需要的朋友可以參考一下2022-03-03
Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼
這篇文章主要介紹了Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
python 如何在list中找Topk的數(shù)值和索引
這篇文章主要介紹了python 如何在list中找Topk的數(shù)值和索引的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
PyChon中關(guān)于Jekins的詳細(xì)安裝(推薦)
這篇文章主要介紹了PyChon中關(guān)于Jekins的詳細(xì)安裝(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

