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 基础教程之Map使用方法
Jan 17 Python
python数据结构之列表和元组的详解
Sep 23 Python
python如何将图片转换为字符图片
Aug 19 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Python类中的魔法方法之 __slots__原理解析
Aug 26 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python实现IOU计算案例
Apr 12 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 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
第二节--PHP5 的对象模型
2006/11/16 PHP
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
js实现圆盘记速表
2015/08/03 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
原生python实现knn分类算法
2019/10/24 Python
Python多线程多进程实例对比解析
2020/03/12 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
安全生产汇报材料
2014/02/17 职场文书
初中学校对照检查材料
2014/08/19 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers