Python多程序寫入同一檔案的方法

2022-09-27 02:48:18 字數 1393 閱讀 8557

最近用python的正規表示式處理了一些文字資料,需要把結果寫到檔案裡面,但是由於檔案比較大,所以執行起來花費的時間很長。但是開啟任務管理器發現cpu只占用了25%,上網找了一下原因發現是由於乙個叫gil的存在,使得python在同一時間只能執行乙個執行緒,所以只占用了乙個cpu,由於我的電腦是4核的,所以cpu利用率就是25%了。

既然多執行緒沒有什麼用處,那就可以使用多程序來處理,畢竟多程序是可以不受gil影響的。python提程式設計客棧供了乙個mul的多程序庫,但是多程序也有一些問題,比如,如果程序都需要寫入同乙個檔案,那麼就會出現多個程序爭用資源的問題,如果不解決,那就會使檔案的內容順序雜亂。這就需要涉及到鎖了,但是加鎖一般會造成程式的執行速度下降,而且如果程序在多處需要向檔案輸出,也不好把這些**整個都鎖起來,如果都鎖起來,那跟單程序還有什麼區別。有乙個解決辦法就是把向檔案的輸出都整合到一塊去,在這一塊集中加個鎖,這樣問題就不大了。不過還有一種更加優雅的解決方式:使用multiprocessing庫的**函式功能。

具體思路跟把檔案輸出集中在一起也差不多,就是把程序需要寫入檔案的內容作為返回值返回給惠和的**函式,使用**函式向檔案中寫入內容。這樣做在windows下面還有乙個好處,在windows環境下,python的多程序沒有像linux環境下的多程序一樣,linux環境下的multiprocessing庫是基於fork函式,父程序fork了乙個子程序之後會把自己的資源,比如檔案控制代碼都傳遞給子程序。但是在windows環境下沒有fork函式,所以如果你在父程序裡開啟了乙個檔案,在子程序中寫入,會出現valueerror: i/o operasmaroation on closed file這樣的錯誤,而且在windows環境下最好加入if __name__ == '__main__'這樣的判斷,以避免一些可能出現的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):

posmaroaol.apply_async(sayhi, (i,), callback=mycallback)

pool.close()

pool.join()

e2 = time.time()

print float(e2 - e1)

執行結果如下:

本文標題: python多程序寫入同一檔案的方法

本文位址:

python(一) 檔案操作

my file open my file.txt w 用法 open 檔名 形式 其中形式有 w write r read.my file.write text 該語句會寫入先前定義好的 text my file.close 關閉檔案 this is my first test.this is th...

php多執行緒操作同一檔案 待續

同意檔案操作同意檔案的問題在於邏輯有些地方不合適,如果多個執行緒同時寫入,在不加鎖的情況下,可能導致得到結果不如意,為了安全,和髒讀 資料庫的詞 應該使用排他鎖,這就意味著每次只能被乙個執行緒操作。其他執行緒只能等待,如果超時則會報錯。1 關鍵函式 2fopen 開啟檔案或乙個http位址,形成乙個...

提取同一資料夾下所有檔案的同一列

import pandas as pd import os from pandas import series,dataframe dir r c users user pythonproject venv 資料 raw data 設定工作路徑 新建列表,存放檔名 可以忽略,但是為了做的過程能心裡有...