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 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python中的下划线详解
Jun 24 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
python 删除非空文件夹的实例
Apr 26 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
python实现监听键盘
Apr 26 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验证码生成类分享
2014/08/21 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
Python 爬虫的原理
2020/07/30 Python
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
PHP如何自定义函数
2016/09/16 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
单位实习证明怎么写
2014/01/17 职场文书
聚美优品的广告词
2014/03/14 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
开发房地产协议书
2014/09/14 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技