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中的socket模块使用代理实例
May 29 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python sort、sorted高级排序技巧
Nov 21 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python基础之文件读取的讲解
Feb 16 Python
24式加速你的Python(小结)
Jun 13 Python
在django admin中添加自定义视图的例子
Jul 26 Python
python gdal安装与简单使用
Aug 01 Python
python的等深分箱实例
Nov 22 Python
如何基于Python创建目录文件夹
Dec 31 Python
keras导入weights方式
Jun 12 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)
2013/06/21 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
js运动事件函数详解
2016/10/21 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
零基础学python应该从哪里入手
2020/08/11 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
实习医生自我评价
2013/09/22 职场文书
心得体会怎么写
2013/12/30 职场文书
食品安全责任书
2014/04/15 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
初中班主任心得体会
2016/01/07 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
python opencv通过4坐标剪裁图片
2021/06/05 Python
详解JS数组方法
2021/11/20 Javascript