一、需求分析
有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。 现在需要读取这些txt文件,判断key是否在数据仓库中。(redis或者mysql)
为空的记录,需要写入到日志文件中!
任务分工
1. 使用多进程技术,每一个进程读取一个txt文件
2. 使用协程技术,批量读取txt文件记录。比如一次性读取 2000条记录
注意:打开文件操作,最好在一个进程中,重复打开文件,会造成系统资源浪费!
二、完整代码
代码语言:javascript复制#!/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 = "