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之编写类之三子类
Oct 11 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
python写入中英文字符串到文件的方法
May 06 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
python3 pillow模块实现简单验证码
Oct 31 Python
Django url 路由匹配过程详解
Jan 22 Python
python如何进行基准测试
Apr 26 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/18 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python 基础教程之包和类的用法
2017/02/23 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
非常详细的C#面试题集
2016/07/13 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
经销商年会策划方案
2014/05/29 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
2014年妇联工作总结
2014/11/21 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
MySQL学习之基础命令实操总结
2022/03/19 MySQL