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实现自动登录人人网并采集信息的方法
Jun 28 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
python使用mysql的两种使用方式
Mar 07 Python
《与孩子一起学编程》python自测题
May 27 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
如何基于Python实现自动扫雷
Jan 06 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
Python 无限级分类树状结构生成算法的实现
Jan 21 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 一个页面执行时间类代码
2010/03/05 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
Linux下Python获取IP地址的代码
2014/11/30 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
个人自我评价和职业目标
2014/01/24 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
艾滋病宣传标语
2014/06/25 职场文书
2014年化验员工作总结
2014/11/18 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
2015年项目工作总结
2015/04/29 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby