Python多线程实现支付模拟请求过程解析


Posted in Python onApril 21, 2020

思路:

队列使用说明:

  •  multiprocessing.Queue()#用于进程间通信,单主进程与子进程无法通信(使用进程池时尽量不要使用这个)

  •  multiprocessing.Manager().Queue()#用于主子进程通信,通过进程池(pool)创建的进程可以数据共享

  •  queue.Queue()#用于线程间通信,同一进程内的数据可以共享

1.从数据库里获取待支付的订单

2.将获取出来的数据添加至队列(queue.Queue()),并在函数中返回消息队列的长度

3.根据队列长度创建对应的线程数量

4.把创建的线程放在list

5.依次启动

6.最后等待主线程执行完结束,统计函数运行时长

代码如下

import asyncio
import sys
from queue import Queue
sys.path.append("../")
from tool.__init__ import *
from tool.decorator_token import *
import time
from threading import Thread,Lock

class doWeChatNotify(BaseTest):
  def __init__(self):
    super().__init__()
    self.limit_num=100 #查询记录条数
    self.WeChatNotify_sql='''select order_id,order_sn from fw_order where `status`=0 
            and course_id=1569 ORDER BY create_time desc limit %d ;'''%(self.limit_num)
    self.fwh_test_api=fwh_test_api
    self.data = self.my_op.sql_operation_fwh(self.WeChatNotify_sql)
    self.fwh_order_dict = {}
    self.que = Queue()


  @token_fwh#验证token有效性
  def get_fwh_token_list(self):
    token_list=self.fwh_token.loadTokenList()
    return token_list

  @token_crm#验证token有  def get_crm_token_list(self)    token_list=self.token.loadTokenList()
    return token_list

  def testDoWeChatNotify(self):
    DoWeChatNotify_file='../tokenFileAndtxtFiles'+'/'+"DoWeChatNotify_asynchronousPay.txt"
    with open(DoWeChatNotify_file,'a',encoding='utf=-8') as file:
      str_first="order_id\t"+"order_sn\t\n" #文件首行数据
      file.write(str_first)
    fwh_order_id_list, fwh_order_sn_list = [], []

    if self.data!=():
      for a in self.data:
        fwh_order_id=a['order_id']
        fwh_order_sn=a['order_sn']
        self.fwh_order_dict[fwh_order_id]=fwh_order_sn

        with open(DoWeChatNotify_file,'a',encoding='utf-8') as file2:#文件写入
          str_DoWeChatNotifyInfo=str(fwh_order_id)+'\t'+str(fwh_order_sn)+'\t\n'
          file2.flush() #清除缓冲区
          file2.write(str_DoWeChatNotifyInfo)
        self.que.put(self.fwh_order_dict)#将数据添加至队列
    #关闭数据库连接
    # self.my_op.close_db_fwh()
    # self.my_op.close_db()
    return self.que.qsize()#返回队列数量

  def asynchronousPay(self,order_id,order_sn):
    count=1
    count_num=50
    token_list=self.get_fwh_token_list()
    if (self.data!=()):
      headers_form_urlencoded['token']=token_list[0]
      url_wechat_success_huidiao=self.fwh_test_api+'/index/Order/doWeChatNotify'
      data_wechat_success_huidiao=self.data_to_str.requestDataToStr_firefoxAndChrome_fwh('''order_sn:{}
order_id:{}
meth_id:4
timestamp:157129653969
sign:0687b01b300b9e300d3996a9d2173f1380973e5a'''.format(order_sn,order_id))
      request_wechat_success_huidiao=requests.post(url=url_wechat_success_huidiao,headers=headers_form_urlencoded,data=data_wechat_success_huidiao)
      response_wechat_success_huidiao=request_wechat_success_huidiao.json()
      if '订单状态错误,非待支付订单' in response_wechat_success_huidiao['msg']:
        print(data_wechat_success_huidiao)
    else:
      print('待支付订单为空')

  def run_multithreading(self):#多线程
    threads = []#存放所有的线程
    nloops = list(range(self.testDoWeChatNotify()))#获取队列数量
    if len(nloops)>0:
      for i,k in zip(nloops,self.que.get().items()):#根据队列数量来创建线程
        t = Thread(target=self.asynchronousPay,args=(k[0],k[1]))
        threads.append(t)

      for s in nloops: # 开始多线程
        threads[s].start()

      for j in nloops: # 等待所有线程完成
        threads[j].join()
    else:
      print("队列数量为空")

if __name__=="__main__":
  start_time = time.time() # 计算程序开始时间
  wechfy=doWeChatNotify()
  wechfy.run_multithreading()#多线程
  print('程序耗时{:.2f}'.format(time.time() - start_time)) # 计算程序总耗时

总结:亲测运行时间还是会快很多,单线程支付100个订单四十几秒的样子,多线程运行不用join2.x秒,用join八秒的样子,还有很大的优化空间,因为运行时会创建100个线程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python读写Excel文件的实例
Nov 01 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python制作动态字符图的实例
Jan 27 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
django使用JWT保存用户登录信息
Apr 22 Python
使用numpy nonzero 找出非0元素
May 14 Python
python基础之函数的定义和调用
Oct 24 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 #Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 #Python
TensorFLow 数学运算的示例代码
Apr 21 #Python
jupyter修改文件名方式(TensorFlow)
Apr 21 #Python
Python基于requests实现模拟上传文件
Apr 21 #Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 #Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 #Python
You might like
PHP中的日期及时间
2006/11/23 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
深入理解PHP中的count函数
2016/05/31 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
python中二维阵列的变换实例
2014/10/09 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python3中zip()函数使用详解
2018/06/29 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
python实现文件的分割与合并
2019/08/29 Python
Django异步任务线程池实现原理
2019/12/17 Python
python绘制封闭多边形教程
2020/02/18 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
Gap英国官网:Gap UK
2018/07/18 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
部队反四风对照检查材料
2014/09/26 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL