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检测lvs real server状态
Jan 22 Python
Python输出9*9乘法表的方法
May 25 Python
Python的时间模块datetime详解
Apr 17 Python
python 二分查找和快速排序实例详解
Oct 13 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
Python换行与不换行的输出实例
Feb 19 Python
python调用摄像头的示例代码
Sep 28 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 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
2009/06/29 PHP
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
Three.js基础学习之场景对象
2017/09/27 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
vue框架中props的typescript用法详解
2020/02/17 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
python学生管理系统开发
2019/01/30 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js