python在协程中增加任务实例操作


Posted in Python onFebruary 28, 2021

1、添加一个任务

task2 = visit_url('http://another.com', 3)
asynicio.run(task2)

2、这 2 个程序一共消耗 5s 左右的时间。并没有发挥并发编程的优势

import asyncio
import time
async def visit_url(url, response_time):
  """访问 url"""
  await asyncio.sleep(response_time)
  return f"访问{url}, 已得到返回结果"

async def run_task():
  """收集子任务"""
  task = visit_url('http://wangzhen.com', 2)
  task_2 = visit_url('http://another', 3)
  await asyncio.run(task)
  await asyncio.run(task_2)
asyncio.run(run_task())
print(f"消耗时间:{time.perf_counter() - start_time}")

3、如果是并发编程,这个程序只需要消耗 3s,也就是task2的等待时间。

要想使用并发编程形式,需要把上面的代码改一下。asyncio.gather 会创建 2 个子任务,当出现 await 的时候,程序会在这 2 个子任务之间进行调度。

async def run_task():
  """收集子任务"""
  task = visit_url('http://wangzhen.com', 2)
  task_2 = visit_url('http://another', 3)
  await asynicio.gather(task1, task2)

实例扩展:

import asyncio
from threading import Thread
 
 
async def production_task():
  i = 0
  while True:
    # 将consumption这个协程每秒注册一个到运行在线程中的循环,thread_loop每秒会获得一个一直打印i的无限循环任务
    asyncio.run_coroutine_threadsafe(consumption(i),
                     thread_loop) # 注意:run_coroutine_threadsafe 这个方法只能用在运行在线程中的循环事件使用
    await asyncio.sleep(1) # 必须加await
    i += 1
 
 
async def consumption(i):
  while True:
    print("我是第{}任务".format(i))
    await asyncio.sleep(1)
 
 
def start_loop(loop):
  # 运行事件循环, loop以参数的形式传递进来运行
  asyncio.set_event_loop(loop)
  loop.run_forever()
 
 
thread_loop = asyncio.new_event_loop() # 获取一个事件循环
run_loop_thread = Thread(target=start_loop, args=(thread_loop,)) # 将次事件循环运行在一个线程中,防止阻塞当前主线程
run_loop_thread.start() # 运行线程,同时协程事件循环也会运行
 
advocate_loop = asyncio.get_event_loop() # 将生产任务的协程注册到这个循环中
advocate_loop.run_until_complete(production_task()) # 运行次循环

到此这篇关于python在协程中增加任务实例操作的文章就介绍到这了,更多相关python在协程中增加任务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python骚操作之动态定义函数
Mar 26 Python
python中68个内置函数的总结与介绍
Feb 24 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
Python接口测试文件上传实例解析
May 22 Python
为什么说python适合写爬虫
Jun 11 Python
如何利用python进行时间序列分析
Aug 04 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
python 制作本地应用搜索工具
Feb 27 #Python
如何用Python进行时间序列分解和预测
Mar 01 #Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 #Python
python FTP编程基础入门
Feb 27 #Python
python SOCKET编程基础入门
Feb 27 #Python
python 对xml解析的示例
Feb 27 #Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 #Python
You might like
PHP个人网站架设连环讲(四)
2006/10/09 PHP
php连接数据库代码应用分析
2011/05/29 PHP
php实现微信发红包
2015/12/05 PHP
PHP7内核之Reference详解
2019/03/14 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
网络工程师个人的自我评价范文
2013/10/01 职场文书
生产部岗位职责范文
2014/02/07 职场文书
班级德育工作实施方案
2014/02/21 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
假释思想汇报范文
2014/10/11 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
python数字类型和占位符详情
2022/03/13 Python