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中getaddrinfo()基本用法实例分析
Jun 28 Python
python 默认参数问题的陷阱
Feb 29 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
Flask缓存静态文件的具体方法
Aug 02 Python
python中sys模块是做什么用的
Aug 16 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 Python
Python时间操作之pytz模块使用详解
Jun 14 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中有关长整数的一些操作教程
2019/09/11 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
JS打印组合功能
2016/08/04 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
岗位廉政承诺书
2014/03/27 职场文书
一体化教学实施方案
2014/05/10 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
工资证明格式模板
2015/06/12 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
信息技术课教学反思
2016/02/23 职场文书
Python爬取某拍短视频
2021/06/11 Python