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 相关文章推荐
pycharm安装图文教程
May 02 Python
Django验证码的生成与使用示例
May 20 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
Python编程argparse入门浅析
Feb 07 Python
Python发送http请求解析返回json的实例
Mar 26 Python
Python  unittest单元测试框架的使用
Sep 08 Python
Python编程中类与类的关系详解
Aug 08 Python
python openCV获取人脸部分并存储功能
Aug 28 Python
tensorflow 查看梯度方式
Feb 04 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
js查找节点的方法小结
2015/01/13 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
简介Python中用于处理字符串的center()方法
2015/05/18 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python dict乱码如何解决
2020/06/07 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
心得体会怎么写
2013/12/30 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
公证书格式
2015/01/23 职场文书
小学见习报告
2015/06/23 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript