import asyncio
import sys
from queue import Queue sys.path.append("../")
# from tool.__init__ import *
from tool.Common import *
from tool.tencent_cloud_mysql_connect import Mysql_operation
from tool.request_data_change_to_StrEncode import request_data_change_to_str
import time
import gevent
import asyncio
import aiohttp#requests异步版 class doWeChatNotify(object):
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.WeChatNotify_sql ='''select order_id,order_sn from order_info limit 500;'''
self.fwh_test_api=fwh_test_api
self.my_op=Mysql_operation()
self.data = self.my_op.sql_operation(self.WeChatNotify_sql)
self.data_to_str=request_data_change_to_str()
self.fwh_order_dict = {}
self.que = Queue() 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)#将数据添加至队列
return self.que.qsize()#返回队列数量 async def asynchronousPay(self,order_id,order_sn):
if (self.data!=()):
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))
async with aiohttp.ClientSession() as session:
async with session.post(url=url_wechat_success_huidiao,
headers=headers_form_urlencoded,
data=data_wechat_success_huidiao) as response:
await asyncio.sleep(1)
return await response.read() else:
print('待支付订单为空') async def run(self):
self.testDoWeChatNotify() # 获取队列数量
order_id = asyncio.Semaphore(500) # 限制并发量为500
to_get = [self.asynchronousPay(order_id,order_sn) for order_id,order_sn in self.que.get().items()] # 总共1000任务
# threads = [gevent.spawn(self.asynchronousPay, order_id, order_sn) for order_id, order_sn in
# self.que.get().items()]
# gevent.joinall(threads)#gevent协程写法
await asyncio.wait(to_get) def run_startAll(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.run())
loop.close() if __name__=="__main__":  
start_time = time.time() # 计算程序开始时间
wechfy=doWeChatNotify()
wechfy.run_startAll()
print('程序耗时{:.2f}'.format(time.time() - start_time)) # 计算程序总耗时

总结:
  1.使用协程请求需用到aiohttp这个库(我把它理解成是requests的异步版本),如果直接用requests这个库去请求则就不能发挥协程的优势(涉及到io操作)或者直接说不能称为了真正的协程;
  2.async/awiat关键字的使用:配合asyncio模块一起使用(结合aiohttp)
  3.执行500个订单的时间为11.x秒,跟多线程执行差不多(但是这个对系统的开销会小很多)
 

python使用协程完成批量模拟支付的更多相关文章

  1. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  2. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...

  3. python的协程和_IO操作

    协程Coroutine: 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行. 注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点 ...

  4. python gevent 协程

    简介 没有切换开销.因为子程序切换不是线程切换,而是由程序自身控制,没有线程切换的开销,因此执行效率高, 不需要锁机制.因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断 ...

  5. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  6. 关于Python的协程问题总结

    协程其实就是可以由程序自主控制的线程 在python里主要由yield 和yield from 控制,可以通过生成者消费者例子来理解协程 利用yield from 向生成器(协程)传送数据# 传统的生 ...

  7. 【Python】协程

    协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...

  8. Python之协程(coroutine)

    Python之协程(coroutine) 标签(空格分隔): Python进阶 coroutine和generator的区别 generator是数据的产生者.即它pull data 通过 itera ...

  9. python 3 协程函数

    python 3 协程函数 1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器 2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yiel ...

  10. Python之协程函数

    Python之协程函数 什么是协程函数:如果一个函数内部yield的使用方法是表达式形式的话,如x=yield,那么该函数成为协程函数. def eater(name): print('%s star ...

随机推荐

  1. AI辅助教学,甚至AI教学,逐渐成为可能

    看新闻,有感: 太火爆!一门课,两个月吸粉十五万人!企业纷纷布局!千亿级大市场,来了?

  2. 支持AMD GPU —— 如何运行docker环境下的Jax环境

    相关: 支持NVIDIA GPU -- 如何运行docker环境下的Jax环境 官方给出的安装主页: https://hub.docker.com/r/rocm/jax 安装命令: docker pu ...

  3. 【转载】 python鸭子类型与protocol

    版权声明:本文为CSDN博主「yuanzhoulvpi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/yuan ...

  4. 多线程之park()与interrupt()的理解

    1.背景 其他不多说,很多时候面试会问 2.代码 package com.ldp.demo01; import com.common.MyThreadUtil; import lombok.exter ...

  5. uniapp tabBar配置后不显示

    pages 和tabbar 箭头所指位置 第一个必须一样 写法也要完全一致 上面这样写 下面这样写 这样都不能匹配上正常显示

  6. PHPExcel 使用学习

    基本实现步骤: <?php require "/PHPExcel/PHPExcel.php";//引入PHPExcel $objPHPExcel = new PHPExcel ...

  7. python学习之---迭代器与生成器

    什么是迭代器 可迭代对象: 可以通过for循环来实现遍历,例如list.string.dict 迭代器: 不仅可以使用for循环,还可以使用next()方法.__iter__() next():获取容 ...

  8. 白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

    2024年7月24日,由数据猿主办,IDC协办,新华社中国经济信息社.上海大数据联盟.上海市数商协会.上海超级计算中心作为支持单位,举办"数智新质·力拓未来 2024企业数智化转型升级发展论 ...

  9. 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具

    Metabase 是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板.与传统的 BI 工具相比,Metabase 不需要用户具备编写 SQL 的能力 ...

  10. 十五张图带你快速入门 shardingsphere-proxy

    Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品: ShardingSphere-Proxy ShardingSphere-JDBC 很多同学对于 Shardi ...