python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)
一、需求分析
有一批key已經(jīng)寫入到3個(gè)txt文件中,每一個(gè)txt文件有30萬(wàn)行記錄。
現(xiàn)在需要讀取這些txt文件,判斷key是否在數(shù)據(jù)倉(cāng)庫(kù)中。(redis或者mysql)
為空的記錄,需要寫入到日志文件中!
任務(wù)分工
1. 使用多進(jìn)程技術(shù),每一個(gè)進(jìn)程讀取一個(gè)txt文件
2. 使用協(xié)程技術(shù),批量讀取txt文件記錄。比如一次性讀取 2000條記錄
注意:打開(kāi)文件操作,最好在一個(gè)進(jìn)程中,重復(fù)打開(kāi)文件,會(huì)造成系統(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é)程池?cái)?shù)量 pool = Pool(COROUTINE_NUMBER) # 使用協(xié)程池 # 模擬數(shù)據(jù)倉(cāng)庫(kù),測(cè)試數(shù)據(jù) data_dict = {"1":"x1","3":"x3","5":"x5","7":"x7","9":"x9"} class TestProgram(object): # 測(cè)試程序 def __init__(self): self.BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 項(xiàng)目根目錄 def write_log(self,number, content, colour='white', skip=False): """ 寫入日志文件 :param content: 寫入內(nèi)容 :param colour: 顏色 :param skip: 是否跳過(guò)打印時(shí)間 :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: # 不跳過(guò)打印時(shí)間時(shí) 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,"錯(cuò)誤,{} 記錄為空".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, "開(kāi)始讀取文件 {}".format(file_name),"green") with open(file_name, encoding='utf-8') as f: # 使用協(xié)程池,執(zhí)行任務(wù)。語(yǔ)法: pool.map(func,iterator) # partial使用偏函數(shù)傳遞參數(shù) # 注意:has_null第一個(gè)參數(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): """ 讀取指定的文件,判斷每一個(gè)key是否為空 :param number: :return: """ startime = time.time() # 開(kāi)始時(shí)間 # 清空日志 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秒時(shí) take_time = 1 # 設(shè)置為1秒 # 計(jì)算花費(fèi)時(shí)間 m, s = divmod(take_time, 60) h, m = divmod(m, 60) self.write_log(number, "%s.txt 花費(fèi)時(shí)間 %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() # 啟動(dòng)子進(jìn)程 p_lst.append(p) # 將所有進(jìn)程寫入列表中 for p in p_lst: p.join() # 檢測(cè)p是否結(jié)束,如果沒(méi)有結(jié)束就阻塞直到結(jié)束,否則不阻塞 TestProgram().main() # 啟動(dòng)主程序,它會(huì)開(kāi)啟3個(gè)進(jìn)程。
執(zhí)行輸出
以上就是python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于python 多進(jìn)程和協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python3爬蟲(chóng)中異步協(xié)程的用法
- 在python里使用await關(guān)鍵字來(lái)等另外一個(gè)協(xié)程的實(shí)例
- Python使用monkey.patch_all()解決協(xié)程阻塞問(wèn)題
- 在Python 的線程中運(yùn)行協(xié)程的方法
- python 協(xié)程 gevent原理與用法分析
- Python 異步協(xié)程函數(shù)原理及實(shí)例詳解
- 簡(jiǎn)單了解python gevent 協(xié)程使用及作用
- python中的協(xié)程深入理解
- python編程使用協(xié)程并發(fā)的優(yōu)缺點(diǎn)
- 深入理解python協(xié)程
相關(guān)文章
Python趣味挑戰(zhàn)之用pygame實(shí)現(xiàn)飛機(jī)塔防游戲
一步步實(shí)現(xiàn)有趣的飛機(jī)塔防游戲,有興趣了解一下嗎?文中有非常詳細(xì)的代碼示例,對(duì)喜歡玩游戲的小伙伴們很有幫助哦,需要的朋友可以參考下2021-05-05Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法整數(shù)規(guī)劃問(wèn)題示例解析
整數(shù)規(guī)劃問(wèn)題在工業(yè)、經(jīng)濟(jì)、國(guó)防、醫(yī)療等各行各業(yè)應(yīng)用十分廣泛,是指規(guī)劃中的變量(全部或部分)限制為整數(shù),屬于離散優(yōu)化問(wèn)題Discrete Optimization2021-10-10PyTorch實(shí)現(xiàn)多維度特征輸入邏輯回歸
這篇文章主要介紹了PyTorch實(shí)現(xiàn)多維度特征輸入邏輯回歸,首先進(jìn)行數(shù)據(jù)采取數(shù)據(jù)集展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-03-03Python json解析庫(kù)jsonpath原理及使用示例
這篇文章主要介紹了Python json解析庫(kù)jsonpath原理及使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python 多線程共享變量的實(shí)現(xiàn)示例
這篇文章主要介紹了Python 多線程共享變量的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python學(xué)習(xí)之SpaCy庫(kù)的高級(jí)特性詳解
在之前的文章中,我們介紹了SpaCy庫(kù)的一些基本概念和功能,在這篇文章中,我們將深入學(xué)習(xí)一些更高級(jí)的特性,包括詞向量、依賴性解析、和自定義組件2023-07-07使用Python進(jìn)行二進(jìn)制文件讀寫的簡(jiǎn)單方法(推薦)
下面小編就為大家?guī)?lái)一篇使用Python進(jìn)行二進(jìn)制文件讀寫的簡(jiǎn)單方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09