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爬取网站数据保存使用的方法
Nov 20 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python操作excel让工作自动化
Aug 09 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
python实现操作文件(文件夹)
Oct 31 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
Python ORM框架Peewee用法详解
Apr 29 Python
用python批量下载apk
Dec 29 Python
Python 发送SMTP邮件的简单教程
Jun 24 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python实现五子棋小游戏
2020/03/25 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
详解python中init方法和随机数方法
2019/03/13 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python tkinter canvas使用实例
2019/11/04 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
Django url 路由匹配过程详解
2021/01/22 Python
市场部专员岗位职责
2013/11/30 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
借款协议书
2014/04/12 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年保送生自荐信
2015/03/24 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
Python预测分词的实现
2021/06/18 Python