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 09 Python
python sort、sorted高级排序技巧
Nov 21 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
详解Python中的type和object
Aug 15 Python
Python中垃圾回收和del语句详解
Nov 15 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
Python给图像添加噪声具体操作
Mar 03 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
虫族 Zerg 热键控制
2020/03/14 星际争霸
基于文本的搜索
2006/10/09 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
jquery创建div 实现代码
2009/04/27 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
利用python开发app实战的方法
2019/07/09 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
python实现翻译word表格小程序
2020/02/27 Python
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
电气专业推荐信范文
2013/11/18 职场文书
销售总监工作职责
2013/11/21 职场文书
实习求职信
2013/12/01 职场文书
运动会入场词100字
2014/02/06 职场文书
十一酒店活动方案
2014/02/20 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python