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 Django(图文)
Nov 04 Python
python文件写入实例分析
Apr 08 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
微信跳一跳游戏python脚本
Apr 01 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
python3实现绘制二维点图
Dec 04 Python
python 实现性别识别
Nov 21 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 Python
python中%格式表达式实例用法
Jun 18 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 curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python使用opencv进行人脸识别
2017/04/07 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Python使用gRPC传输协议教程
2018/10/16 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
python绘制规则网络图形实例
2019/12/09 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
质量承诺书范文
2014/03/27 职场文书
财产公证书格式
2014/04/10 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python