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爬虫之神器正则表达式
Nov 06 Python
Python解析xml中dom元素的方法
Mar 12 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
python 实现图片批量压缩的示例
Dec 18 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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的正则处理函数总结分析
2008/06/20 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
表单提交验证类
2006/07/14 Javascript
js+css在交互上的应用
2010/07/18 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python算法之栈(stack)的实现
2014/08/18 Python
跟老齐学Python之for循环语句
2014/10/02 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
浅谈Python3中print函数的换行
2020/08/05 Python
Python中return函数返回值实例用法
2020/11/19 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
火锅店创业计划书范文
2014/02/02 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
干部考核工作总结
2015/08/12 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL