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进行一些简单的自然语言处理的教程
Mar 31 Python
Python下线程之间的共享和释放示例
May 04 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
Python输出指定字符串的方法
Feb 06 Python
Python的in,is和id函数代码实例
Apr 18 Python
python适合做数据挖掘吗
Jun 16 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 Python
如何在Anaconda中打开python自带idle
Sep 21 Python
python requests模块的使用示例
Apr 07 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页面间传递参数实例代码
2008/06/05 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python实现的各种排序算法代码
2013/03/04 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
python创造虚拟环境方法总结
2019/03/04 Python
python修改文件内容的3种方法详解
2019/11/15 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
html5与css3小应用
2013/04/03 HTML / CSS
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
大学生活学习的自我评价
2013/12/03 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
一句话工作感言
2014/03/01 职场文书
有创意的广告词
2014/03/18 职场文书
节电标语大全
2014/06/23 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
面试通知短信
2015/04/20 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android