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中运行并行任务技巧
Feb 26 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python实现对csv文件的列的内容读取
Jul 04 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
利用Python检测URL状态
Jul 31 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
python 制作一个gui界面的翻译工具
May 14 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实现简单的新闻发布系统实例
2015/07/28 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
python获取当前计算机cpu数量的方法
2015/04/18 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python os用法总结
2018/06/08 Python
python3实现点餐系统
2019/01/24 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
python实现猜数游戏
2020/03/27 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
应届毕业生应聘自荐信
2013/12/07 职场文书
旅游个人求职信范文
2014/01/30 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
css3新特性的应用示例分析
2022/03/16 HTML / CSS
Python图像处理库PIL详细使用说明
2022/04/06 Python