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中if __name__ == '__main__'作用解析
Jun 29 Python
python 写的一个爬虫程序源码
Feb 28 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
python3 读取Excel表格中的数据
Oct 16 Python
python for 循环获取index索引的方法
Feb 01 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Python 中Operator模块的使用
Jan 30 Python
Python实现为PDF去除水印的示例代码
Apr 03 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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网上商城购物车设计代码分享
2012/02/15 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
js一组验证函数
2008/12/20 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
如何用itertools解决无序排列组合的问题
2017/05/18 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
后勤工作职责
2013/12/22 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
OpenCV全景图像拼接的实现示例
2021/06/05 Python