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按照多个字符对字符串进行分割的方法
Mar 17 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python 高级专用类方法的实例详解
Sep 11 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
django 外键model的互相读取方法
Dec 15 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Python识别html主要文本框过程解析
Feb 18 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
pandas分批读取大数据集教程
Jun 06 Python
Python轻量级web框架bottle使用方法解析
Jun 13 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封装的MSSql操作类完整实例
2016/05/26 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
JS错误处理与调试操作实例分析
2020/04/13 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
对python sklearn one-hot编码详解
2018/07/10 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
python中os.remove()用法及注意事项
2021/01/31 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
简单说说tomcat的配置
2013/05/28 面试题
光声世纪笔试题目
2012/08/25 面试题
How TDD works
2012/09/30 面试题
自荐书模板
2013/12/15 职场文书
模范教师事迹材料
2014/02/10 职场文书
春节超市活动方案
2014/08/14 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
Java实现学生管理系统(IO版)
2022/02/24 Java/Android