python一点通: Async异步函数很好,但是如何有效执行阻塞任务?

当使用 asyncio.create_task(function1)asyncio.create_task(function2) 时,你正在创建两个将在同一个事件循环中并发运行的异步任务。这些任务运行是否高效取决于它们本身的性质。

理解异步任务

如果 function1function2 是异步函数(即,它们使用了 async def 并包含 await 语句),只要这些函数执行的是非阻塞操作,比如:

  • 网络 I/O
  • 磁盘 I/O
  • 定时器(例如 await asyncio.sleep()
  • 其他异步操作

在这种情况下,asyncio 会处理调度,在任务等待 I/O 操作完成时暂停它们,并在操作就绪时恢复它们。这就实现了高效的并发。

阻塞代码的低效性

如果 function1function2 包含阻塞操作(例如 CPU 密集型任务,time.sleep() 或阻塞 I/O),它们将无法高效运行。阻塞代码会阻塞整个事件循环,防止其他任务并发运行。

高效异步任务示例

以下是一个使用 asyncio.create_task() 高效运行非阻塞异步任务的示例:

import asyncioasync def function1():print('Function 1: Start')await asyncio.sleep(2)  # 模拟非阻塞 I/Oprint('Function 1: End')async def function2():print('Function 2: Start')await asyncio.sleep(3)  # 模拟非阻塞 I/Oprint('Function 2: End')async def main():# 创建任务以并发运行它们task1 = asyncio.create_task(function1())task2 = asyncio.create_task(function2())# 如果你想等待它们完成,可以选择性地 await 这些任务await task1await task2# 运行主异步函数
asyncio.run(main())

使用执行器处理阻塞代码

如果需要运行阻塞 I/O 任务,应该将它们卸载到线程或进程池中,以避免阻塞事件循环:

import asyncio
from concurrent.futures import ThreadPoolExecutor
import timedef blocking_io_task1():print('Blocking Task 1: Start')time.sleep(2)  # 模拟阻塞 I/Oprint('Blocking Task 1: End')def blocking_io_task2():print('Blocking Task 2: Start')time.sleep(3)  # 模拟阻塞 I/Oprint('Blocking Task 2: End')async def main():loop = asyncio.get_running_loop()with ThreadPoolExecutor() as pool:# 将阻塞任务卸载到线程池task1 = loop.run_in_executor(pool, blocking_io_task1)task2 = loop.run_in_executor(pool, blocking_io_task2)# 如果你需要等待它们完成,可以这么做await task1await task2# 运行主异步函数
asyncio.run(main())

总结

  • 高效异步任务: 对非阻塞操作使用 async def 函数和 await 语句。
  • 处理阻塞代码: 使用 loop.run_in_executor 将阻塞任务卸载到线程或进程池。

通过仔细区分阻塞和非阻塞任务,可以确保使用 asyncio.create_task() 时任务高效运行。

阅读英文

hndel-aysnc-with-blocking-code

AI好书推荐

AI日新月异,再不学来不及了。但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?

人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典

北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索PostgreSQL的多模型世界:灵活存储,无限可能

在数据库的世界里,有一种神器,它以其无与伦比的灵活性和强大的功能,赢得了全球开发者的青睐。它就是——PostgreSQL,一个真正的多模型数据库管理系统。 为什么选择PostgreSQL? 可靠性和稳定性:PostgreSQL…

Rust anyhow 简明教程

anyhow 是 Rust 中的一个库,旨在提供灵活的、具体的错误处理能力,建立在 std::error::Error 基础上。它主要用于那些需要简单错误处理的应用程序和原型开发中,尤其是在错误类型不需要被严格区分的场景下。 以下是 anyhow 的几个关键特性&…

MAVEN架构项目管理工具

1、什么是maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 2、maven的目标:Maven的主要目标是为了使开发人员在最短的时间内领会项目的所有状态 3、使用maven不需要考虑各个依赖的版本,因…

Follow Carl To Grow|【LeetCode】530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

【LeetCode】530.二叉搜索树的最小绝对差 题意:给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 思路:中序遍历拿到递增序列,然后求相邻…

【将xml文件转yolov5训练数据txt标签文件】连classes.txt都可以生成

将xml文件转yolov5训练数据txt标签文件 前言一、代码解析 二、使用方法总结 前言 找遍全网,我觉得写得最详细的就是这个博文⇨将xml文件转yolov5训练数据txt标签文件 虽然我还是没有跑成功。那个正则表达式我不会改QWQ,但是不妨碍我会训练ai。 最终成功…

UE5中在地形中加入湖、河

系统水资产添加 前提步骤123 完成 前提 使用版本 UE5.0.3,使用插件为UE内置的Water和water Extras. 步骤 1 记得重启 2 增加地形&#xff0c;把<启用编辑图层>勾选 如果地形没有勾选上编辑图层&#xff0c;那么就会导致湖、河等水景象无法融入地形。 如果忘记勾选…

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了h…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

【Python】 了解二分类:机器学习中的基础任务

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 在机器学习和数据科学领域&#xff0c;分类问题是最常见的任务之一。分类问题可以分为多类分…

使用贝塞尔曲线实现一个iOS时间轴

UI效果 实现的思路 就是通过贝塞尔曲线画出时间轴的圆环的路径&#xff0c;然后 使用CAShaper来渲染UI&#xff0c;再通过 animation.beginTime [cilrclLayer convertTime:CACurrentMediaTime() fromLayer:nil] circleTimeOffset 来设置每个圆环的动画开始时间&#xff0c; …

探索ChatGPT-4在解决化学知识问题上的研究与应用

1. 概述 近年来&#xff0c;人工智能的发展主要集中在 GPT-4 等大型语言模型上。2023 年 3 月发布的这一先进模型展示了利用广泛知识应对从化学研究到日常问题解决等复杂挑战的能力。也开始进行研究&#xff0c;对化学的各个领域&#xff0c;从化学键到有机化学和物理化学&…

【设计模式】行为型设计模式之 备忘录模式(快照模式)

介绍 备忘录应用场景明确并且有限&#xff0c;一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复&#xff0c;备忘录模式能有效的节省时间和空间开销。 定义 备忘录模式&#xff1a;也称为快照模式&#xff0c;在不违背封装原则的前提下&#xff0c;捕获一个对象的内…

BFS实现图的点的层次-java

加强对广度优先搜索的理解&#xff0c;其实就是主要的3个步骤&#xff0c;外加数组模拟单链表是基础&#xff0c;要搞懂。 目录 前言 一、图中点的层次 二、算法思路 1.广度优先遍历 2.算法思路 三、代码如下 1.代码如下&#xff08;示例&#xff09;&#xff1a; 2.读入…

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器

探索基于订阅式的电视App&#xff1a;Android TV 端强大的开源视频播放器 在智能电视和流媒体日益普及的今天&#xff0c;一款强大的视频播放器是家庭娱乐的重要组成部分。正是这样一款为Android TV设计的开源视频播放器。本文将深入探讨电视盒子OSC的技术特点、使用方法以及其…

在Java中类中的成员变量和成员方法在jvm中如何协调调用及优化

第一部分&#xff1a; 在Java中类中的成员变量和成员方法在jvm中如何协调调用 在Java中&#xff0c;类的成员变量和成员方法在JVM&#xff08;Java虚拟机&#xff09;中的表现方式有一定的规则和结构。以下是对成员变量和成员方法在JVM中的一些关键点的解释&#xff1a; 成员…

抛弃昂贵BI,企业仍可低成本实现数据分析

有的读者看完《BI工具选型不入坑&#xff0c;你要这么选》这篇文章就陷入迷茫了&#xff0c;我要做企业级数据分析&#xff0c;看过去各家产品都各有千秋&#xff0c;实在难以抉择&#xff0c;或者已经选了仍是纠结不已。 这里我抛出另一种思路&#xff1a;如果不用BI&#xf…

Terminal Multiplexer的使用

tmux&#xff08;Terminal Multiplexer&#xff0c;终端复用器&#xff09;是一个可以在单个终端窗口中运行多个独立会话的软件工具。它允许用户在同一个终端窗口内分割屏幕&#xff0c;创建多个虚拟终端&#xff0c;这样就可以同时监视和控制多个进程&#xff0c;即使终端窗口…

C#操作MySQL从入门到精通(17)——使用联结

前言: 我们在查询数据的过程中有时候查询的数据不是来自一个表而是来自多个表,本文使用的测试数据如下: 本文使用了两个表student_info、address_info student_info的数据如下: address_info的数据如下: 1、内联结 所谓内联结就是求交集,两个表都有的数据才是有效数…

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…