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之wxPython菜单使用详解
Sep 28 Python
Python contextlib模块使用示例
Feb 18 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
Python eval函数介绍及用法
Nov 09 Python
Python合并多张图片成PDF
Jun 09 Python
基于Python实现将列表数据生成折线图
Mar 23 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
如何给phpadmin一个保护
2006/10/09 PHP
用PHP函数解决SQL injection
2006/10/09 PHP
php 获取可变函数参数的函数
2009/08/26 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
Python标准库sched模块使用指南
2017/07/06 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
Python项目跨域问题解决方案
2020/06/22 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
函授自我鉴定
2013/11/06 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
党性心得体会
2014/09/03 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
详解MySQL集群搭建
2021/05/26 MySQL