使用 python asyncio的一个例子,以及在jupyter lab中使用时的一个常识

1 asyncio的优势

asynciothreading 都是 Python 中处理并发的方式,但它们各有优势。

  1. 效率asyncio 是基于单线程的,它通过协程(coroutine)实现并发,协程之间的切换开销小于线程之间的切换开销。在 I/O 密集型任务(如网络请求)中,asyncio 可以更高效地利用 CPU。

  2. 资源占用asyncio 的协程是在一个线程中运行的,因此它占用的系统资源(如内存)通常比多线程要少。

  3. 编程模型asyncio 提供了一种基于事件循环的编程模型,这种模型可以更好地处理异步 I/O 操作。而 threading 则是基于线程的并发模型,更适合于 CPU 密集型任务。

总的来说,asynciothreading 各有适用的场景。如果你的任务主要是 I/O 密集型的,那么 asyncio 可能是一个更好的选择。

2 举例: IDE 和Jupyter lab运行 asyncio的小区别

下面看这么一个例子:

import asyncioasync def my_task(task_id):# Your time-consume taskawait asyncio.sleep(2)  # Simulate a long processreturn {task_id: "done"}async def my_coroutine():# launch 100 tasktasks = []for i in range(100):tasks.append(my_task(i))# wait for all tasks to completeresults = await asyncio.gather(*tasks)total_result = {}for result in results:total_result.update(result)return total_resultfinal_result = asyncio.run(my_coroutine())
print(final_result)

这个代码在python IDE 中执行, 没有任何错误, 但是在jupyter 中执行会报错。

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[132], line 2521         total_result.update(result)22     return total_result
---> 25 final_result = asyncio.run(my_coroutine())26 print(final_result)File /data/anaconda3/yes/envs/jupyter/lib/python3.10/asyncio/runners.py:33, in run(main, debug)9 """Execute the coroutine and return the result.10 11 This function runs the passed coroutine, taking care of(...)30     asyncio.run(main())31 """32 if events._get_running_loop() is not None:
---> 33     raise RuntimeError(34         "asyncio.run() cannot be called from a running event loop")36 if not coroutines.iscoroutine(main):37     raise ValueError("a coroutine was expected, got {!r}".format(main))RuntimeError: asyncio.run() cannot be called from a running event loop

原因是 Jupyter Lab 中的事件循环是由其内部的 Tornado 服务器提供的。在 Jupyter Lab 中,事件循环主要用于处理用户的输入、执行代码、更新界面等任务。例如,当你在 Jupyter Lab 中运行一个代码单元时,这个操作就会被添加到事件循环中,然后由事件循环调度 Python 解释器来执行这段代码。在代码执行的同时,事件循环还可以继续处理其他的事件,如用户的其他输入、网络请求等。

因此,如果你在 Jupyter Lab 中使用 asyncio.runloop.run_until_complete 这样的函数来运行协程,会导致错误,因为这些函数会尝试创建和管理一个新的事件循环,而在 Jupyter Lab 中,已经有一个正在运行的事件循环了。在这种情况下,你应该使用 asyncio.create_task 或直接在 cell 中 await 协程来运行协程。比如采用下面方式来执行

import asyncioasync def my_task(task_id):# Your time-consume taskawait asyncio.sleep(2)  # Simulate a long processreturn {task_id: "done"}async def my_coroutine():# launch 100 tasktasks = []for i in range(100):tasks.append(my_task(i))# wait for all tasks to completeresults = await asyncio.gather(*tasks)total_result = {}for result in results:total_result.update(result)return total_resultfinal_result = await my_coroutine()
print(final_result)

但是呢, 这个代码在python IDE 中会报错 “SyntaxError: ‘await’ outside function
”,直接与asyncio设计的理念冲突了。

3 在asyncio中执行耗时任务

loop.run_in_executor是Python的asyncio库中的一个方法。用于在单独的线程或进程中运行一个函数,并返回一个表示函数执行的Future对象。这允许你运行阻塞或CPU密集型操作,而不会阻塞事件循环。
下面看一个简单的示例:

import asyncio
import concurrent.futuresdef cpu_bound_operation(x):# 这可以是任何CPU密集型操作return x * xasync def main():loop = asyncio.get_event_loop()# 在单独的线程中运行with concurrent.futures.ThreadPoolExecutor() as pool:result = await loop.run_in_executor(pool, cpu_bound_operation, 5)print(f'结果是 {result}')# 运行main函数直到它完成
asyncio.run(main())

示例中, 建立了一个 python的线程池, 针对一个 CPU 耗时任务, 提交到线程池, 有单独的线程来执行, 而不要同步执行, 进而阻塞事件循环。

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

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

相关文章

MySQL中怎么查询LONGBLOB类型数据的大小

在MySQL中,LONGBLOB 是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据。但是,LONGBLOB 数据类型本身并不直接存储数据的大小(长度)。它存储的是二进制数据的实际内容。 1.查询 LONG…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十七)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 27节) P27《26.Stage模型-UIAbility的启动模式》 本节讲解 UIAbility的启动模式:Stage模型的应用&#x…

策略模式-通过枚举newInstance替代工厂

策略模式-使用枚举newInstance 前言一、枚举类:MarkCheckDataTypeEnum二、抽象类:AbstractMarkChecker三、检查类:MarkPeopleChecker四、demo演示总结 前言 很久没写文章了~~ 吐槽下:入职新公司后,基本在搬砖&#xf…

这几个PR小技巧你Get到了吗?

学习是永无止境的,需要不间断地学习,获取新知识。今天带来了5个PR小技巧,可以先收藏起来Adobe Premiere Pro 2024的获取查看Baidu Cloud 1、双倍稳定画面更舒适 一般来说大型电视剧、电影使用的拍摄设备都是非常高端的,不像我们…

【研究】国内外大模型公司进展

2022年11月,OpenAI推出基于GPT-3.5的ChatGPT后,引发全球AI大模型技术开发与投资热潮。AI大模型性能持续快速提升。以衡量LLM的常用评测标准MMLU为例,2021年底全球最先进大模型的MMLU 5-shot得分刚达到60%,2022年底超过70%&#xf…

面相对象程序设计

面相对象程序设计包含内容如下 局域网聊天程序设网页浏览器设计电子日历记事本的设计 以其中的一个的报告进行举例 1需求与总体设计 1 1.1需求分析 1 1.2总体设计方案 1 1.2.1系统功能分析以及功能表 1 1.3系统类图的关系以及表之间的联系 2 2详细设计 3 2.1 Manag…

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下,返回状态为fulfilled,值为undefined。 所以可以直接进行.then操作: this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …

ARM day1练习 求1~100内的和

题目要求:用ARM汇编语言实现1~100之间之和(5050 0x13BA) .text 声明以下内容是文本段的内容 .global _start .global声明_start标签是一个全局标签_start:mov r1,#0x0 r1 summov r2,#0x1 r2 ifun: 加法函数cmp r2,#100 r2中的值和100作比较add…

理解CNN模型如何学习

深度学习模型常常被认为是不可解释的。但是人们正在探索不同的技术来解释这些模型内发生了什么。对于图像,由卷积神经网络学习的特征是可解释的。我们将探索两种流行的技术来理解卷积神经网络。 可视化中间层的输出 可视化中间层的输出将有助于我们理解输入图像如何…

JupyterLab使用指南(七):JupyterLab使用 LaTeX 生成数学公式

在 JupyterLab 中,可以使用 LaTeX 语法生成复杂的数学公式。JupyterLab 内置对 LaTeX 的支持,使得我们可以方便地在 notebook 中编写和展示数学公式。以下是详细的步骤和示例。 1. 使用 LaTeX 生成数学公式 LaTeX 是一种专门用于排版数学公式的语言。J…

springmvc中Restful风格案例

文章目录 8、RESTFul案例8.1、准备工作 8、RESTFul案例 8.1、准备工作 对员工表(模拟表数据)的员工信息进行增删改查 搭建环境 准备实体类 public class Employee {private Integer id;//主键private String lastName;//姓名private String email;…

Vite和Vue3:Vite是一种新的开发服务器和构建工具,它利用了现代浏览器支持的原生ES模块导入,为开发者提供了极速的冷启动和即时热更新

I. Vite 的概述 Vite的定义和功能 Vite 是一个由 Vue.js 的作者开发的现代前端构建工具,目标是提供一种尽可能快的现代开发体验。"Vite" 在法语中意思是 "快",这也正是其设计的目标之一。 Vite 的功能主要包括: 开发服务器:使用原生的 ES module…

Stable Diffusion 插件安装与推荐,助力你的AI绘图

在上一篇文章我们安装了Stable Diffusion ,这篇文章我们来安装Stable Diffusion的插件 Stable Diffusion的插件是绘画中重要的一环,好的插件可以让你的绘画更加得心应手 中英双语插件 为什么要安装中英双语插件呢,不能只安装中文插件吗&…

安卓应用开发学习:获取导航卫星信息

一、引言 我昨天写了《安卓应用开发学习:获取经纬度及地理位置描述信息》日志,今天再接再厉,记录一下跟着《Android App 开发进阶与项目实战》一书,实现获取导航卫星信息,并在手机上显示的功能的情况。先上实现后的在…

Redis的持久化方式和注意点

redis持久篇 两种持久化技术: AOF日志和RDB快照 Redis默认会开启RBD快照 AOF:持久化只会记录写操作命令。 是一种日志,写入到文件,有相应的格式文本 就是 Redis 里的AOF(Append Only File)持久化功能,注意只会记录写操作命令…

决定马萨诸塞州版图的关键历史事件

决定马萨诸塞州版图的关键历史事件: 1. 早期探索与*民定居:17世纪初,英国清教徒为寻求宗教自由,乘坐“五月花号”到达新大陆,并于1620年在现在的普利茅斯建立了第一个永久性英国*民地。随后,更多的英国*民…

LKD-Net: Large Kernel Convolution Network for Single Image Dehazing

LKD-Net:用于单幅图像去噪的大型核卷积网络 摘要 基于深度卷积神经网络(CNN)的单幅图像去噪方法已经取得了很大的成功。以往的方法致力于通过增加网络的深度和宽度来提高网络的性能。目前的方法侧重于增加卷积核的大小,以受益于更大的接受野来增强其性能…

昇思25天学习打卡营第1天|新手上路

这里写自定义目录标题 打卡昇思MindSpore扫盲快速入门 打卡 昇思MindSpore扫盲 第一节基本是一个mindspore的科普扫盲。大概介绍一通mindspore的一些架构,feature,以及其对比于其他同类框架的优势。简单扫读了一遍大概有点印象直接跳过。 快速入门 这…

Vue 3 中处理文件上传和响应式更新

Vue 3 中处理文件上传和响应式更新 一、前言1.创建文件上传组件2.解释代码3.在主应用中使用文件上传组件4.总结 一、前言 在现代 web 开发中,文件上传是一个常见需求。本文将详细介绍如何在 Vue 3 中处理文件上传,并确保上传后的文件列表能够响应式更新…

Linux内核编译流程

删除之前编译生成的文件和配置文件 make mrproper生成.config文件 make menuconfig编译 make -j41. No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘ vim .config 修改CONFIG_SYSTEM_TRUSTED_KEYS为"" 修改C…