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 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
pytorch多GPU并行运算的实现
Sep 27 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
python3爬取各类天气信息
2018/02/24 Python
Python标准库shutil用法实例详解
2018/08/13 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
什么是Web Service?
2012/07/25 面试题
机电一体化求职信
2014/03/10 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
骨干教师申报材料
2014/12/17 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
在校学生证明格式
2015/06/24 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python