python 多进程和协程配合使用写入数据


Posted in Python onOctober 30, 2020

一、需求分析

有一批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 = {"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: 写入内容
  :param colour: 颜色
  :param skip: 是否跳过打印时间
  :return:
  """
  # 颜色代码
  colour_dict = {
   'red': 31, # 红色
   'green': 32, # 绿色
   'yellow': 33, # 黄色
   'blue': 34, # 蓝色
   'purple_red': 35, # 紫红色
   'bluish_blue': 36, # 浅蓝色
   '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: 文件标记
  :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是否为空
  :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 # 设置为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 多进程和协程配合使用写入数据

以上就是python 多进程和协程配合使用写入数据的详细内容,更多关于python 多进程和协程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python海龟绘图实例教程
Jul 24 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
python使用win32com库播放mp3文件的方法
May 30 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
tensorflow实现简单的卷积网络
May 24 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
对YOLOv3模型调用时候的python接口详解
Aug 26 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
Pycharm快捷键配置详细整理
Oct 13 Python
python打包生成so文件的实现
Oct 30 #Python
pytorch 移动端部署之helloworld的使用
Oct 30 #Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 #Python
Python模拟登录和登录跳转的参考示例
Oct 30 #Python
python中watchdog文件监控与检测上传功能
Oct 30 #Python
GitHub上值得推荐的8个python 项目
Oct 30 #Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 #Python
You might like
PHP简洁函数小结
2011/08/12 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
数据库测试通常都包括哪些方面
2015/11/30 面试题
Unix如何添加新的用户
2014/08/20 面试题
幼儿园保教管理制度
2014/02/03 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
安全生产先进个人总结
2015/02/15 职场文书
努力工作保证书
2015/02/28 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
2015暑期社会实践调查报告
2015/07/14 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
Python中rapidjson参数校验实现
2021/07/25 Python