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中比较运算符的使用
May 13 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
python绘制简单折线图代码示例
Dec 19 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
python 编码规范整理
May 05 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
Python requests模块session代码实例
Apr 14 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
May 12 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Python如何输出警告信息
Jul 30 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 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
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
tsconfig.json配置详解
2019/05/17 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python封装对象实现时间效果
2020/04/23 Python
Python中__name__的使用实例
2015/04/14 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
python直接访问私有属性的简单方法
2016/07/25 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
.net开发工程师面试题
2014/02/25 面试题
工厂仓管员岗位职责
2014/01/01 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
个人四风对照检查材料
2014/09/26 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年行政部工作总结
2014/11/19 职场文书
法定代表人身份证明书
2015/06/18 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python