python 多程序和協程配合使用寫入資料

2022-09-27 08:24:11 字數 3389 閱讀 4641

一、需求分析

有一批key已經寫入到3個txt檔案中,每乙個txt檔案有30萬行記錄。

現在需要讀取這些txt檔案,判斷key是否在資料倉儲中。(redis或者mysql)

為空的記錄,需要寫入到日誌檔案中!

任務分工

1. 使用多程序技術,每乙個程序讀取乙個txt檔案

2. 使用協程技術,批量讀取txt檔案記錄。比如一次性讀取 2000條記錄

注意:開啟檔案操作,最好在乙個程序中,重複開啟檔案,會造成系統資源浪費!

二、完整**

#!/usr/bin/env python3

# coding: utf-8

"""多執行緒和協程配合使用示例

"""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 # 協程池數量

pool = pool(coroutine_number) # 使用協程池

# 模擬資料倉儲,測試資料

data_dict =

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: 寫入內容

:param colour: 顏色

:param skip: 是否跳過列印時間

:return:

"""# 顏色**

colour_dict =

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(inf程式設計客棧o)

f.write(content + "\n")

def has_null(self, key, number):

"""輸出key

:param key: 鍵值

:param number: 檔案標記

: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: 檔案標記

: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:

# 使用協程池,執行任務。語法: pool.map(func,iterator)

# partial使用偏函式傳遞引數

# 注意:has_null第乙個引數,必須是迭代器遍歷的值

pool.map(partial(self.has_null, number=number), f)

self.write_log(number, "結束檔案讀取 {} 完成".format(file_name),"green")

return true

def run(self, number):

"""讀取指定的檔案,判斷每乙個key是否為空

:jgwjeucparam 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 # 設定為1秒

# 計算花費時間

m, s = divmod(take_time, 60)

h, m = divmod(m, 60)

self.write_log(number, "%s.txt 花費時間 %02d:%02d:%02d" % (number,h, m, s),"green")

def main(self):

"""使用多執行緒執行程式

:return:

"""# 檔案標記列表

file_list = ["7001", "7002", "7003"]

p_lst = # 執行緒列表

for i in file_list:

# self.run(i)

p = process(target=self.run, args=(i,)) # 子程序呼叫函式

p.start() # 啟動子程序

p_lst.append(p) # 將所有程序寫入列表中

for p in p_lst: p.join() # 檢測p是否結束,如果沒有結束就阻塞直到結束,否則不阻塞

testprogram().main() # 啟動主程式,它會開啟3個程序。

執行輸出

python 多程序和協程配合使用

有一批key已經寫入到3個txt檔案中,每乙個txt檔案有30萬行記錄。現在需要讀取這些txt檔案,判斷key是否在資料倉儲中。redis或者mysql 為空的記錄,需要寫入到日誌檔案中!1.使用多程序技術,每乙個程序讀取乙個txt檔案 2.使用協程技術,批量讀取txt檔案記錄。比如一次性讀取 20...

python 多執行緒和協程配合使用

有一批key已經寫入到3個txt檔案中,每乙個txt檔案有30萬行記錄。現在需要讀取這些txt檔案,判斷key是否在資料倉儲中。redis或者mysql 為空的記錄,需要寫入到日誌檔案中!1.使用多執行緒技術,每乙個執行緒讀取乙個txt檔案 2.使用協程技術,批量讀取txt檔案記錄。比如一次性讀取 ...

Python的執行緒 程序和協程

程序 乙個程序就是乙個正在執行的程式,它是計cpu分配資源的最小單位。每個程序都有自己獨立的記憶體空間。能同時執行的程序數最多不超過核心數,也就是每個核心 同一時刻只能執行乙個程序。那麼多程序就是能 同時 執行多個程序 比如同時聽 和寫 這裡的 同時 可以指cpu通過極快地在程序間來回切換來實現,所...