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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python爬虫之百度API调用方法
Jun 11 Python
Python中str.join()简单用法示例
Mar 20 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python游戏开发的五个案例分享
Mar 09 Python
Python如何安装第三方模块
May 28 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
jupyter notebook快速入门及使用详解
Nov 13 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 set_time_limit()函数的使用详解
2013/06/05 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php的ddos攻击解决方法
2015/01/08 PHP
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
node跨域请求方法小结
2017/08/25 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python ljust rjust center输出
2008/09/06 Python
python操作日期和时间的方法
2014/03/11 Python
python xml解析实例详解
2016/11/14 Python
python爬虫的工作原理
2017/03/05 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python版DDOS攻击脚本
2019/06/12 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
Python random模块的使用示例
2020/10/10 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
房产委托公证书
2014/04/08 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
项目合作意向书模板
2014/07/29 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
垂直极限观后感
2015/06/08 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android