最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 多進(jìn)程和協(xié)程配合使用寫(xiě)入數(shù)據(jù)

 更新時(shí)間:2020年10月30日 11:48:29   作者:py3study  
這篇文章主要介紹了python 多進(jìn)程和協(xié)程配合使用寫(xiě)入數(shù)據(jù),幫助大家利用python高效辦公,感興趣的朋友可以了解下

一、需求分析

有一批key已經(jīng)寫(xiě)入到3個(gè)txt文件中,每一個(gè)txt文件有30萬(wàn)行記錄。
現(xiàn)在需要讀取這些txt文件,判斷key是否在數(shù)據(jù)倉(cāng)庫(kù)中。(redis或者mysql)

為空的記錄,需要寫(xiě)入到日志文件中!

任務(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):
  """
  寫(xiě)入日志文件
  :param content: 寫(xiě)入內(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)程寫(xiě)入列表中

  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é)程配合使用寫(xiě)入數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于python 多進(jìn)程和協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • numpy中np.append()函數(shù)用法小結(jié)

    numpy中np.append()函數(shù)用法小結(jié)

    在numpy的函數(shù)庫(kù)中,np.append()函數(shù)是一個(gè)常用的數(shù)組操作函數(shù),它在進(jìn)行數(shù)組操作時(shí)能夠?qū)蓚€(gè)數(shù)組進(jìn)行拼接,并返回一個(gè)拼接后的新數(shù)組,下面就來(lái)介紹一下具體用法,感興趣的可以了解一下
    2023-11-11
  • Python?os.environ實(shí)戰(zhàn)應(yīng)用及技巧總結(jié)

    Python?os.environ實(shí)戰(zhàn)應(yīng)用及技巧總結(jié)

    這篇文章主要介紹了Python?os.environ實(shí)戰(zhàn)應(yīng)用及技巧的相關(guān)資料,os.environ是Python中管理環(huán)境變量的強(qiáng)大工具,提供了對(duì)系統(tǒng)環(huán)境變量的訪問(wèn)和修改能力,需要的朋友可以參考下
    2025-03-03
  • PyCharm出現(xiàn)卡頓問(wèn)題的解決

    PyCharm出現(xiàn)卡頓問(wèn)題的解決

    這篇文章主要介紹了PyCharm出現(xiàn)卡頓問(wèn)題的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 如何使用pyinstaller打包時(shí)引入自己編寫(xiě)的庫(kù)

    如何使用pyinstaller打包時(shí)引入自己編寫(xiě)的庫(kù)

    這篇文章主要介紹了如何使用pyinstaller打包時(shí)引入自己編寫(xiě)的庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件

    如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件

    這篇文章主要介紹了如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python中標(biāo)準(zhǔn)庫(kù)OS的常用方法總結(jié)大全

    Python中標(biāo)準(zhǔn)庫(kù)OS的常用方法總結(jié)大全

    python中的OS庫(kù)提供了使用各種操作系統(tǒng)功能的接口。是經(jīng)常用到的一個(gè)庫(kù),所以這篇文章主要給大家總結(jié)介紹了關(guān)于Python中標(biāo)準(zhǔn)庫(kù)OS的常用方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • matplotlib階梯圖的實(shí)現(xiàn)(step())

    matplotlib階梯圖的實(shí)現(xiàn)(step())

    這篇文章主要介紹了matplotlib階梯圖的實(shí)現(xiàn)(step()),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python實(shí)現(xiàn)按目錄層級(jí)輸出文件名并保存為excel

    Python實(shí)現(xiàn)按目錄層級(jí)輸出文件名并保存為excel

    當(dāng)我們發(fā)現(xiàn)電腦的內(nèi)存很滿,或平時(shí)工作中文件夾管理不清晰,導(dǎo)致里面的文件數(shù)據(jù)很雜亂,查找很不方便,一個(gè)一個(gè)文件夾去看去找然后刪除又很浪費(fèi)時(shí)間。本文將介紹如何利用Python實(shí)現(xiàn)按目錄層級(jí)輸出文件名并保存為excel,需要的可以參考一下
    2022-02-02
  • PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決

    PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決

    這篇文章主要介紹了PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)

    Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要實(shí)現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊(duì)列、鏈表。大家都知道可以用C語(yǔ)言實(shí)現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實(shí)Python也可以實(shí)現(xiàn),下面跟著小編一起來(lái)學(xué)習(xí)。
    2016-08-08

最新評(píng)論

道真| 南城县| 鲜城| 莫力| 中宁县| 井冈山市| 额尔古纳市| 东兰县| 西充县| 岳阳市| 锡林浩特市| 射阳县| 康定县| 罗源县| 丁青县| 洛宁县| 峨边| 呼玛县| 昭苏县| 综艺| 柘荣县| 兴海县| 墨玉县| 桦甸市| 嘉定区| 盐山县| 水城县| 天祝| 永和县| 嘉义县| 芒康县| 佛坪县| 高雄县| 陇南市| 绥中县| 酉阳| 肇庆市| 琼结县| 湖口县| 文山县| 绍兴市|