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使用win32com在百度空间插入html元素示例
Feb 20 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python+pygame实现坦克大战
Sep 10 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
Python中os模块功能与用法详解
Feb 26 Python
python实现3D地图可视化
Mar 25 Python
python mysql中in参数化说明
Jun 05 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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
网页上facebook分享功能具体实现
2014/01/26 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
django admin 添加自定义链接方式
2020/03/11 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
试述DBMS的主要功能
2016/11/13 面试题
管理科学大学生求职信
2013/11/13 职场文书
工程建设实施方案
2014/03/14 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
法定代表人资格证明书
2014/09/11 职场文书
党员民主生活会材料
2014/12/15 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
教研活动主持词
2015/07/03 职场文书
2015年中秋寄语
2015/07/31 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers