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判断、获取一张图片主色调的2个实例
Apr 10 Python
python中去空格函数的用法
Aug 21 Python
Python中tell()方法的使用详解
May 24 Python
遍历python字典几种方法总结(推荐)
Sep 11 Python
Python reduce()函数的用法小结
Nov 15 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
Tensorflow卷积神经网络实例
May 24 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
Python 实现域名解析为ip的方法
Feb 14 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
为什么说python适合写爬虫
Jun 11 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python类继承用法实例分析
2015/05/27 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
Shell编程面试题
2012/05/30 面试题
生产车间主管岗位职责
2013/12/28 职场文书
公司前台辞职报告
2014/01/19 职场文书
初中班主任评语大全
2014/04/24 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
Python绘画好看的星空图
2022/03/17 Python