网络编程
位置:首页>> 网络编程>> Python编程>> Python 多线程处理任务实例

Python 多线程处理任务实例

作者:soul11201  发布时间:2021-06-25 04:50:05 

标签:Python,多线程,处理任务

美餐每天发一个用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)

来源:https://www.tuicool.com/articles/bQZv6bm

0
投稿

猜你喜欢

  • 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1、如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
  • 通常我们做统计图的时候需要借助组件来完成例如mschart,aspchart等但是这个类不需要任何组件,而且使用方便,本站测试可用:clsG
  • 前言本文紧接着前一篇的入门教程,会介绍一些关于pandas的进阶知识。建议读者在阅读本文之前先看完pandas入门教程。同样的,本文的测试数
  • 大家在用asp开发程序的时候,有时候会碰到以下的错误提示:Active Server Pages 错误 'ASP 0141'
  • 实现效果效果如图,只识别一定距离内的物体哈哈哈哈哈哈哈哈哈,但我不知道这有什么用实现代码import pyrealsense2 as rsi
  • 本文实例讲述了Python中pandas模块DataFrame创建方法。分享给大家供大家参考,具体如下:DataFrame创建1. 通过列表
  • 接着上一篇,统一思想,遵循标准。如何遵循标准,其实标准有很多,结构标准,表现标准,行为标准。选择标准规范,就优先选择W3C推荐的标准。结构标
  • 本文实例讲述了PHP动态生成指定大小随机图片的方法。分享给大家供大家参考,具体如下:<?php$image_width = 100;$
  • <% On Error Resume Next Const uploadPath = "/uploads/" &#
  • 看了不少朋友的个人网站,有一个小问题,似乎很多朋友都忽略了,那就是版权声明的写法。虽然那只是一小行字,不过作为设计师也好,作为个人的爱好也好
  • 最简单的关闭一个窗口的方法是点击标题栏上的 x 标志。但是,在下面的例子中,我们将展示如何通过编程来控制关闭窗口。我们将使用PyQt5的信号
  • 阅读上一章:[翻译]标记语言和样式手册 Chapter 15 为body指定样式Chapter 16 下一步现在你知道了如何使用标准改进你的
  • 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。
  • python2:print语句,语句就意味着可以直接跟要打印的东西,如果后面接的是一个元组对象,直接打印python3:print函数,函数
  • 三遍记忆,让你记住海量素材的准确位置和用途,提高其可用性.这仅仅是一个示意图.在以往的日子里,我做到了只要脑袋里冒出一个想法,立刻就能知道我
  • 本文实例讲述了Python使用matplotlib实现交换式图形显示功能。分享给大家供大家参考,具体如下:一 代码from random i
  • 本文实例讲述了PHP判断是否微信访问的方法。分享给大家供大家参考,具体如下:在开发中有时需要禁止或者仅允许微信浏览器进行访问,则此时就需要对
  • 目的:基于办公与互联网隔离,自带的office软件没有带本地帮助工具,因此在写vba程序时比较不方便(后来发现07有自带,心中吐血,瞎折腾些
  • 本文实例为大家分享了js实现鼠标切换图片的具体代码,供大家参考,具体内容如下实现效果,可以利用鼠标移动在对应的小点点上,或者点击左右两侧的箭
  • 在认证框架中还有其他的一些功能。 我们会在接下来的几个部分中进一步地了解它们。权限权限可以很方便地标识用户和用户组可以执行的操作。 它们被D
手机版 网络编程 asp之家 www.aspxhome.com