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中解析XML数据的方法
Oct 15 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python得到windows自启动列表的方法
Oct 14 Python
对Python3使运行暂停的方法详解
Feb 18 Python
提升python处理速度原理及方法实例
Dec 25 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python实现仿射密码的思路详解
Apr 23 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
优秀求职信范文分享
2014/01/26 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
女生抽烟检讨书
2014/10/05 职场文书
出售房屋协议书范本
2014/10/06 职场文书
护理实习生带教计划
2015/01/16 职场文书
环保守法证明
2015/06/24 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL