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连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
详解python发送各类邮件的主要方法
Dec 22 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
git进行版本控制心得详谈
Dec 10 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
python实现字符串加密成纯数字
Mar 19 Python
Python numpy数组转置与轴变换
Nov 15 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
Django解决frame拒绝问题的方法
Dec 18 Python
基于python制作简易版学生信息管理系统
Apr 20 Python
详解Python生成器和基于生成器的协程
Jun 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
简单了解什么是神经网络
2017/12/23 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python cs架构实现简单文件传输
2020/03/20 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
python 调整图片亮度的示例
2020/12/03 Python
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
世界读书日的活动方案
2014/08/20 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript