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中使用判断语句和循环的教程
Apr 25 Python
讲解Python中的递归函数
Apr 27 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Django实现文件上传下载功能
Oct 06 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python实现对adb命令封装
Mar 06 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
python搜索算法原理及实例讲解
Nov 18 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
python3 删除所有自定义变量的操作
Apr 08 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+SqlServer实现分页显示
2006/10/09 PHP
BBS(php & mysql)完整版(三)
2006/10/09 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
jQuery 创建Dom元素
2010/05/07 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
js获取url传值的方法
2015/12/18 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
javascript时间差插件分享
2016/07/18 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
详解Vue的ref特性的使用
2020/01/24 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
python连接mysql实例分享
2016/10/09 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python获取服务器响应cookie的实例
2018/12/28 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
几个SQL的面试题
2014/03/08 面试题
高三学习决心书
2014/03/11 职场文书
大学毕业寄语大全
2014/04/10 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
产品开发计划书
2014/04/27 职场文书
初三英语教学计划
2015/01/23 职场文书
自我检讨报告
2015/01/28 职场文书
幸福来敲门观后感
2015/06/04 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js
python运行脚本文件的三种方法实例
2022/06/25 Python