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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
python相似模块用例
Mar 04 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
Python 2.7中文显示与处理方法
Jul 16 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python3 xpath和requests应用详解
Mar 06 Python
详解Django配置JWT认证方式
May 09 Python
python可以用哪些数据库
Jun 22 Python
python如何爬取动态网站
Sep 09 Python
pandas按条件筛选数据的实现
Feb 20 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php二维码生成
2015/10/19 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Python递归实现打印多重列表代码
2020/02/27 Python
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
连锁酒店店长职责范本
2014/02/13 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
Python List remove()实例用法详解
2021/08/02 Python
Windows server 2016服务器基本设置
2022/08/14 Servers