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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
讲解Python中运算符使用时的优先级
May 14 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
Python如何存储数据到json文件
Mar 09 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
基于python实现对文件进行切分行
Apr 26 Python
pycharm实现猜数游戏
Dec 07 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下载文件名中解决乱码的问题
2013/06/20 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
PHP设置进度条的方法
2015/07/08 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
laravel model 两表联查示例
2019/10/24 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
Angular实现响应式表单
2017/08/04 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python 字典dict使用介绍
2014/11/30 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python列表list排列组合操作示例
2018/12/18 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
业务员岗位职责
2013/11/16 职场文书
高级电工工作职责
2013/11/21 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
水电站项目建议书
2014/05/12 职场文书
美术教师求职信范文
2015/03/20 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
入团申请书格式
2019/06/20 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python