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科学计算环境推荐——Anaconda
Jun 30 Python
Python实现的一个简单LRU cache
Sep 26 Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Python实现合并两个列表的方法分析
May 28 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
增大python字体的方法步骤
Jul 05 Python
Python 图片处理库exifread详解
Feb 25 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 已经成熟
2006/12/04 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
页面中js执行顺序
2009/11/09 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
jQuery实现tab栏切换效果
2020/12/22 jQuery
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
python线程信号量semaphore使用解析
2019/11/30 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
配件采购员岗位职责
2013/12/03 职场文书
动物科学专业求职信
2014/07/27 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
2014年班干部工作总结
2014/11/25 职场文书
小王子读书笔记
2015/06/29 职场文书