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实现字典(dict)和字符串(string)的相互转换方法
Mar 01 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
python实现飞机大战游戏
Oct 26 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
Python面向对象之类和实例用法分析
Jun 08 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Pytorch转tflite方式
May 25 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
python3的pip路径在哪
Jun 23 Python
Python实现视频中添加音频工具详解
Dec 06 Python
Python实现归一化算法详情
Mar 18 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
客户端静态页面玩分页
2006/06/26 Javascript
js 函数调用模式小结
2011/12/26 Javascript
页面使用密码保护代码
2013/04/10 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python中os模块功能与用法详解
2020/02/26 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
python自动下载图片的方法示例
2020/03/25 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
计算机专业毕业生求职信分享
2013/12/24 职场文书
抽奖活动主持词
2014/03/31 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
资料员岗位职责
2015/02/10 职场文书
一个都不能少观后感
2015/06/04 职场文书
高效课堂教学反思
2016/02/24 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle