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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
浅谈python中的占位符
Nov 09 Python
django站点管理详解
Dec 12 Python
Python内置函数reversed()用法分析
Mar 20 Python
python中ASCII码和字符的转换方法
Jul 09 Python
Windows下PyCharm安装图文教程
Aug 27 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python实现二分类的卡方分箱示例
Nov 22 Python
django的autoreload机制实现
Jun 03 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 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
关于手调机和数调机的选择
2021/03/02 无线电
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python实现用户管理系统
2018/01/10 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
公司领导推荐信
2013/11/12 职场文书
《雷雨》教学反思
2014/02/20 职场文书
个人职业及收入证明
2014/10/13 职场文书
社区好人好事材料
2014/12/26 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript