[英]Real-time handling of multiple files in data processing (Python Multiprocessing)
該程序正在監視文件夾received_dir
並實時處理收到的文件。 處理完文件后,應刪除原始文件以節省磁盤空間。 我正在嘗試使用Python
multiprocessing
和Pool
。 我想檢查當前方法是否存在任何技術缺陷。
當前代碼中的一個問題是程序要等到隊列中的所有20個文件都處理完后再開始下一輪,因此在某些情況下(即各種文件大小)可能效率低下。
from multiprocessing import Pool
import os
import os.path
Parse_OUT="/opt/data/"
def parser(infile):
out_dir=date_of(filename)
if not os.path.exists(out_dir):
os.mkdir(out_dir)
fout=gzip.open(out_dir+'/'+filename+'csv.gz','wb')
with gzip.open(infile) as fin:
for line in fin:
data=line.split(',')
fout.write(data)
fout.close()
os.remove(infile)
if __name__ == '__main__':
pool=Pool(20)
while True:
targets=glob.glob(received_dir)[:10]
pool.map(parser, targets)
pool.close()
我看到幾個問題:
if not os.path.exists(out_dir): os.mkdir(out_dir)
:這是一個競爭條件。 如果兩個 worker 試圖同時創建同一個目錄,一個會引發異常。 不要做 if 條件。 只需調用os.makedirs(out_dir, exist_ok=True)
不要用字符串添加來組合文件路徑。 只需執行os.path.join(out_dir, filename+'csv.gz')
。 這更干凈,故障狀態更少
即使沒有出現新目錄,也不必在 while True 循環中旋轉,您可以使用 Linux 上的 inotify 機制來監視目錄的更改。 如果實際上有任何事情要做,那只會喚醒您的過程。 查看pyinotify: https : //github.com/seb-m/pyinotify
由於您提到您對批處理不滿意:您可以使用pool.apply_async
在新操作可用時啟動它們。 您的主循環不會對結果做任何事情,因此您可以“開火並忘記”
順便說一句,你為什么要開始一個有 20 個工人的池,然后你一次只啟動 10 個目錄操作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.