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网页请求urllib2模块简单封装代码
Feb 07 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
发布你的Python模块详解
Sep 15 Python
详解Python之unittest单元测试代码
Jan 24 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
flask应用部署到服务器的方法
Jul 12 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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/11/25 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
如何解决python多种版本冲突问题
2020/10/13 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
社保委托书怎么写
2014/08/02 职场文书
庆六一宣传标语
2014/10/08 职场文书
保证书格式
2015/01/16 职场文书
三方合作意向书范本
2015/05/09 职场文书
开票证明
2015/06/23 职场文书
结婚典礼主持词
2015/06/29 职场文书
高老头读书笔记
2015/06/30 职场文书
教师病假条范文
2015/08/17 职场文书