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 相关文章推荐
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
Python如何计算语句执行时间
Nov 22 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
python实现人机五子棋
Mar 25 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
python 如何实现遗传算法
Sep 22 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
PyCharm 光标变成黑块的解决方式
Feb 06 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无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php数组指针操作详解
2017/02/14 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
python3跳出一个循环的实例操作
2020/08/18 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
CSMA/CD介质访问控制协议
2015/11/17 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
关于建议书的格式范文
2014/05/20 职场文书
走进敬老院活动总结
2014/07/10 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
同学联谊会邀请函
2019/06/24 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
Nginx HTTP跳转至HTTPS
2022/05/15 Servers