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的函数的一些高阶特性
Apr 27 Python
深入理解python try异常处理机制
Jun 01 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Python测试框架:pytest学习笔记
Oct 20 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
用python开发一款操作MySQL的小工具
May 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
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
详解javascript appendChild()的完整功能
2018/08/18 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
Python实现telnet服务器的方法
2015/07/10 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
python3使用GUI统计代码量
2019/09/18 Python
Python进程池Pool应用实例分析
2019/11/27 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
创建绿色学校先进个人材料
2014/08/20 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书