python 多进程和协程配合使用写入数据
作者:py3study 发布时间:2023-01-31 10:48:25
标签:python,多进程,协程,写入数据
一、需求分析
有一批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个进程。
执行输出
来源:https://cloud.tencent.com/developer/article/1590280


猜你喜欢
- 现在网页的设计都讲究整体统一风格,无论是网页的文字、图像,还是浏览器的滚动条都要求颜色和风
- 先贴代码,之后完善:<!doctype html><html lang="en"> <he
- 在Bootstrap fileinput中移除预览文件时可以通过配置initialPreviewConfig: [ { url:'d
- 一、 了解postman1. 什么是postman?------ 软件测试用来做接口测试的工具。2. 如何下载postman--
- PHP html_entity_decode() 函数实例把 HTML 实体转换为字符:<?php $str = "&
- create trigger TR_MasterTable_Update on MasterTable after update as if
- 二分类问题可能是应用最广泛的机器学习问题。今天我们将学习根据电影评论的文字内容将其划分为正面或负面。一、数据集来源我们使用的是IMDB数据集
- 在之前一篇文章中我介绍了通过定义Response宏的方式来实现动态改变模板文件路径以实现主题功能: laravel实现模板主题功能,但后来我
- Python自带的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对可调用对象
- ImageEnhance模块提供了一些用于图像增强的类。一、ImageEnhance模块的接口所有的增强类都实现了一个通用的接口,包括一个方
- 显示一个字符串的前几个字符,asp中我们一般使用left(str,n)来获取。left有个不足就是处理汉字和英文字符是一样的,没有区分开,这
- 在使用python爬取网站信息时,查看爬取完后的数据发现,数据并没有被爬取下来,这是因为网站中有UA这种请求载体的身份标识,如果不是基于某一
- 类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。一、绑定方法1 对象的绑定方法
- 前言有一天朋友A向我抱怨,他的老板要求他把几百份word填好的word表格简历信息整理到excel中,看着他一个个将姓名,年龄……从word
- arcgis使用Python脚本进行批量截图介绍最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图
- 在PyTorch中,torch.Tensor类是存储和变换数据的重要工具,相比于Numpy,Tensor提供GPU计算和自动求梯度等更多功能
- 一、定义协程asyncio 执行的任务,称为协程,但是Asyncio 并不能带来真正的并行Python 的多线程因为 GIL(全局解释器锁)
- 1.图片来源该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流。2.读取图片并显示imread():读取图片;imshow()
- 我们今天就来看一下PHP 7正式版的算法和 wordpress 应用在其上的性能表现。PHP7 的安装,真是非常地向下兼容,下载,解压,把之
- 什么是循环呢?简单理解,循环就是反复的去做某一件事情。生活中的例子:比如我们听歌的时候,在歌曲的页面就会出现单曲循环、列表循环、随机播放以及