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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
在Python中处理字符串之isdigit()方法的使用
May 18 Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
python matplotlib拟合直线的实现
Nov 19 Python
python 数据库查询返回list或tuple实例
May 15 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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
php中随机显示图片的函数代码
2011/06/23 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
eclipse php wamp配置教程
2016/06/30 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
python批量修改文件后缀示例代码分享
2013/12/24 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
python自定义时钟类、定时任务类
2021/02/22 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Python 线程池用法简单示例
2019/10/02 Python
python  logging日志打印过程解析
2019/10/22 Python
python实现坦克大战
2020/04/24 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
优秀毕业生自荐信范文
2014/01/01 职场文书
保安的辞职报告怎么写
2014/01/20 职场文书
办护照工作证明
2014/10/01 职场文书
通讯稿范文
2015/07/22 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
浅谈MySQL之select优化方案
2021/08/07 MySQL
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers