python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)
一、需求分析
有一批key已經(jīng)寫入到3個txt文件中,每一個txt文件有30萬行記錄。
現(xiàn)在需要讀取這些txt文件,判斷key是否在數(shù)據(jù)倉庫中。(redis或者mysql)
為空的記錄,需要寫入到日志文件中!
任務(wù)分工
1. 使用多進(jìn)程技術(shù),每一個進(jìn)程讀取一個txt文件
2. 使用協(xié)程技術(shù),批量讀取txt文件記錄。比如一次性讀取 2000條記錄
注意:打開文件操作,最好在一個進(jìn)程中,重復(fù)打開文件,會造成系統(tǒng)資源浪費(fèi)!
二、完整代碼
#!/usr/bin/env python3
# coding: utf-8
"""
多線程和協(xié)程配合使用示例
"""
import os
import time
from gevent import monkey;monkey.patch_all()
from gevent.pool import Pool
from functools import partial
from multiprocessing import Process
COROUTINE_NUMBER = 2000 # 協(xié)程池數(shù)量
pool = Pool(COROUTINE_NUMBER) # 使用協(xié)程池
# 模擬數(shù)據(jù)倉庫,測試數(shù)據(jù)
data_dict = {"1":"x1","3":"x3","5":"x5","7":"x7","9":"x9"}
class TestProgram(object): # 測試程序
def __init__(self):
self.BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 項目根目錄
def write_log(self,number, content, colour='white', skip=False):
"""
寫入日志文件
:param content: 寫入內(nèi)容
:param colour: 顏色
:param skip: 是否跳過打印時間
:return:
"""
# 顏色代碼
colour_dict = {
'red': 31, # 紅色
'green': 32, # 綠色
'yellow': 33, # 黃色
'blue': 34, # 藍(lán)色
'purple_red': 35, # 紫紅色
'bluish_blue': 36, # 淺藍(lán)色
'white': 37, # 白色
}
choice = colour_dict.get(colour) # 選擇顏色
path = os.path.join(self.BASE_DIR, "output_%s.log" % number) # 日志文件
with open(path, mode='a+', encoding='utf-8') as f:
if skip is False: # 不跳過打印時間時
content = time.strftime('%Y-%m-%d %H:%M:%S') + ' ' + content
info = "\033[1;{};1m{}\033[0m".format(choice, content)
print(info)
f.write(content + "\n")
def has_null(self, key, number):
"""
輸出key
:param key: 鍵值
:param number: 文件標(biāo)記
:return: bool
"""
key = key.strip()
if not data_dict.get(key):
self.write_log(number,"錯誤,{} 記錄為空".format(key),"red")
return False
print(key)
return True
def read_file(self, number):
"""
讀取文件
:param number: 文件標(biāo)記
:return:
"""
file_name = os.path.join(self.BASE_DIR, "data", "%s.txt" % number)
# print(file_name)
self.write_log(number, "開始讀取文件 {}".format(file_name),"green")
with open(file_name, encoding='utf-8') as f:
# 使用協(xié)程池,執(zhí)行任務(wù)。語法: pool.map(func,iterator)
# partial使用偏函數(shù)傳遞參數(shù)
# 注意:has_null第一個參數(shù),必須是迭代器遍歷的值
pool.map(partial(self.has_null, number=number), f)
self.write_log(number, "結(jié)束文件讀取 {} 完成".format(file_name),"green")
return True
def run(self, number):
"""
讀取指定的文件,判斷每一個key是否為空
:param number:
:return:
"""
startime = time.time() # 開始時間
# 清空日志
path = os.path.join(self.BASE_DIR, "output_%s.log" % number) # 日志文件
with open(path, mode='w') as f:
pass
self.read_file(number)
endtime = time.time()
take_time = endtime - startime
if take_time < 1: # 判斷不足1秒時
take_time = 1 # 設(shè)置為1秒
# 計算花費(fèi)時間
m, s = divmod(take_time, 60)
h, m = divmod(m, 60)
self.write_log(number, "%s.txt 花費(fèi)時間 %02d:%02d:%02d" % (number,h, m, s),"green")
def main(self):
"""
使用多線程執(zhí)行程序
:return:
"""
# 文件標(biāo)記列表
file_list = ["7001", "7002", "7003"]
p_lst = [] # 線程列表
for i in file_list:
# self.run(i)
p = Process(target=self.run, args=(i,)) # 子進(jìn)程調(diào)用函數(shù)
p.start() # 啟動子進(jìn)程
p_lst.append(p) # 將所有進(jìn)程寫入列表中
for p in p_lst: p.join() # 檢測p是否結(jié)束,如果沒有結(jié)束就阻塞直到結(jié)束,否則不阻塞
TestProgram().main() # 啟動主程序,它會開啟3個進(jìn)程。
執(zhí)行輸出

以上就是python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于python 多進(jìn)程和協(xié)程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
numpy中np.append()函數(shù)用法小結(jié)
在numpy的函數(shù)庫中,np.append()函數(shù)是一個常用的數(shù)組操作函數(shù),它在進(jìn)行數(shù)組操作時能夠?qū)蓚€數(shù)組進(jìn)行拼接,并返回一個拼接后的新數(shù)組,下面就來介紹一下具體用法,感興趣的可以了解一下2023-11-11
Python?os.environ實戰(zhàn)應(yīng)用及技巧總結(jié)
這篇文章主要介紹了Python?os.environ實戰(zhàn)應(yīng)用及技巧的相關(guān)資料,os.environ是Python中管理環(huán)境變量的強(qiáng)大工具,提供了對系統(tǒng)環(huán)境變量的訪問和修改能力,需要的朋友可以參考下2025-03-03
Python中標(biāo)準(zhǔn)庫OS的常用方法總結(jié)大全
python中的OS庫提供了使用各種操作系統(tǒng)功能的接口。是經(jīng)常用到的一個庫,所以這篇文章主要給大家總結(jié)介紹了關(guān)于Python中標(biāo)準(zhǔn)庫OS的常用方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-07-07
matplotlib階梯圖的實現(xiàn)(step())
這篇文章主要介紹了matplotlib階梯圖的實現(xiàn)(step()),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python實現(xiàn)按目錄層級輸出文件名并保存為excel
當(dāng)我們發(fā)現(xiàn)電腦的內(nèi)存很滿,或平時工作中文件夾管理不清晰,導(dǎo)致里面的文件數(shù)據(jù)很雜亂,查找很不方便,一個一個文件夾去看去找然后刪除又很浪費(fèi)時間。本文將介紹如何利用Python實現(xiàn)按目錄層級輸出文件名并保存為excel,需要的可以參考一下2022-02-02
Python實現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)
這篇文章主要實現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊列、鏈表。大家都知道可以用C語言實現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實Python也可以實現(xiàn),下面跟著小編一起來學(xué)習(xí)。2016-08-08

