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 requests 报错方法集锦
Mar 19 Python
python自动12306抢票软件实现代码
Feb 24 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python从入门到精通 windows安装python图文教程
May 18 Python
django实现用户注册实例讲解
Oct 30 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
python3 logging日志封装实例
Apr 08 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
python如何安装下载后的模块
Jul 03 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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过滤危险html代码
2008/08/18 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
Python获取邮件地址的方法
2015/07/10 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python字符串对象实现原理详解
2019/07/01 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
机电专业毕业生推荐信
2013/11/10 职场文书
付款委托书范本
2014/04/04 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
交通违章检讨书
2014/09/21 职场文书
党性分析自查总结
2014/10/14 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL