Python 多线程处理任务实例


Posted in Python onNovember 07, 2021
目录

美餐每天发一个用Excel汇总的就餐数据,我们把它导入到数据库后,行政办公服务用它和公司内的就餐数据进行比对查重。

初始实现是单线程,和import_records去掉多线程后的部分差不多。

读取Excel数据 —> 发送到行政服务接口

安全起见线上操作放在了晚上进行。运行时发现每条数据导入消耗1s多,晚上十点开始跑这几千条数据想想都让人崩溃。

等着也是干等,下楼转两圈透透气,屋里龌龊的空气让人昏昏沉沉,寒冷让人清醒不少,突然想到为什么不用多线程呢?

第一版多线程和处理业务的程序糅合在了一起,跟屎一样难读。后面两天又抽了点时间重构了几个版本,分离出来一个线程池、迭代器和import_records

清晰不少,但是迭代器被暴露了出来,需要import_records调用一下判断当前任务是否给当前线程处理,类似协程的思路。

暴露有好有坏,但已基本满足日常使用,可以往一边先放放了。读读书、看看电影,不亦乐乎 :)。

import threading

def task_pool(thread_num, task_fn):

  if thread_num <= 0 :
      raise ValueError

  threads = []

  def gen_thread_checker(thread_id, step):

      base = 1
      i = 0

      def thread_checker():
          nonlocal i

          i += 1
          # print((thread_id,i,step, i < base or (i - base) % step != thread_id))

          if i < base or (i - base) % step != thread_id:
              return False

          return True

      return thread_checker


  for x in range(0, thread_num):
    threads.append(threading.Thread(target=task_fn, args=(x,thread_num, gen_thread_checker(x, thread_num))))

  # 启动所有线程
  for t in threads:
    t.start()
  # 主线程中等待所有子线程退出
  for t in threads:
    t.join()
import argparse
import re

import requests
from openpyxl import load_workbook
from requests import RequestException

import myThread

parser = argparse.ArgumentParser(description='美餐到店交易数据导入')
parser.add_argument('--filename', '-f', help='美餐到店交易数据 .xlsx 文件路径', required=True)
parser.add_argument('--thread_num', '-t', help='线程数量', default= 100, required=False)
parser.add_argument('--debug', '-d', help='调试模式', default= 0, required=False)
args = parser.parse_args()

filename = args.filename
thread_num = int(args.thread_num)
debug = args.debug

if debug:
    print((filename,thread_num,debug))


def add_meican_meal_record(data):
   pass

def import_records(thread_id, thread_number, thread_checker):
    wb = load_workbook(filename=filename)
    ws = wb.active

    for row in ws:
        #------------------------------------------
        if row[0].value is None:
            break

        if not thread_checker():
            continue
        #------------------------------------------

        if row[0].value == '日期' or row[0].value == '总计' or not re.findall('^\d{4}-\d{1,2}-\d{1,2}$', row[0].value):
            continue
        else:

            date = str.replace(row[0].value,'-', '')

            order_id = row[3].value
            restaurant_name = row[5].value
            meal_plan_name = row[6].value
            meal_staffid = row[10].value
            identify = row[11].value
    
            add_meican_meal_record({
                'orderId':order_id,
                'date': date,
                'meal_plan_name':meal_plan_name,
                'meal_staffid':meal_staffid,
                'identify':identify,
                'restaurant_name':restaurant_name
            })

myThread.task_pool(thread_num,import_records)

到此这篇关于Python 多线程处理任务实例的文章就介绍到这了,更多相关Python 多线程处理任务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python标准库defaultdict模块使用示例
Apr 28 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
Django 外键的使用方法详解
Jul 19 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
Python 3 判断2个字典相同
Aug 06 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
Python3+Django get/post请求实现教程详解
Feb 16 Python
python利用while求100内的整数和方式
Nov 07 #Python
python中if和elif的区别介绍
Nov 07 #Python
python中取整数的几种方法
Python 中的 copy()和deepcopy()
Nov 07 #Python
Python MNIST手写体识别详解与试练
Python基础 括号()[]{}的详解
Nov 07 #Python
Python Flask搭建yolov3目标检测系统详解流程
You might like
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
django 创建过滤器的实例详解
2017/08/14 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
python:动态路由的Flask程序代码
2019/11/22 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
外贸实习生自荐信范文
2013/11/24 职场文书
眼镜促销方案
2014/03/15 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
党建工作经验交流材料
2014/05/25 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
语文复习计划
2015/01/19 职场文书
商务英语求职信范文
2015/03/19 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL