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 生成目录树及显示文件大小的代码
Jul 23 Python
python实现巡检系统(solaris)示例
Apr 02 Python
Python的面向对象思想分析
Jan 14 Python
Python3读取zip文件信息的方法
May 22 Python
详解python中的json的基本使用方法
Dec 21 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python导入坐标点的具体操作
May 10 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
基于python修改srt字幕的时间轴
Feb 03 Python
深入浅析Django MTV模式
Sep 04 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使用ICQ网关发送手机短信
2013/10/30 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python银行系统实战源码
2019/10/25 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
网上蛋糕店创业计划书
2014/01/24 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
小学运动会口号
2014/06/07 职场文书
食品工程专业求职信
2014/06/15 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
调任通知
2015/04/21 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android