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之模拟鼠标键盘动作具体实现
Dec 30 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python复制与引用用法分析
Apr 08 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python判断数字是否是超级素数幂
Sep 27 Python
python监测当前联网状态并连接的实例
Dec 18 Python
使用python爬取抖音视频列表信息
Jul 15 Python
Python中调用其他程序的方式详解
Aug 06 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
分享3个非常实用的 Python 模块
Mar 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简单实现断点续传下载的方法
2015/09/25 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
videocapture库制作python视频高速传输程序
2013/12/23 Python
python简单读取大文件的方法
2016/07/01 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
用python实现百度翻译的示例代码
2018/03/09 Python
Python使用folium excel绘制point
2019/01/03 Python
大学生标准推荐信范文
2013/11/25 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
员工开除通知书
2015/04/25 职场文书
班主任工作总结范文
2015/08/13 职场文书
汉语拼音教学反思
2016/02/22 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
MySQL空间数据存储及函数
2021/09/25 MySQL