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 相关文章推荐
Django中login_required装饰器的深入介绍
Nov 24 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
python实现简易内存监控
Jun 21 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
python文本数据处理学习笔记详解
Jun 17 Python
python 实现多线程下载视频的代码
Nov 15 Python
Python实现word2Vec model过程解析
Dec 16 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
Python的Tqdm模块实现进度条配置
Feb 24 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上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python实现的归并排序算法示例
2017/11/21 Python
基于Python的PIL库学习详解
2019/05/10 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python实现word2Vec model过程解析
2019/12/16 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
日语专业推荐信
2013/11/12 职场文书
道德模范事迹材料
2014/12/20 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
python Polars库的使用简介
2021/04/21 Python
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS