【Python】同步、异步、堵塞、非堵塞、回调

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

文章目录

  • 一、Python中的同步异步
  • 二、Python中的堵塞非堵塞
  • 三、Python中的回调
  • 四、异步编程


一、Python中的同步异步

在 Python 中,同步和异步通常是指代码执行的模式。

同步:

当程序执行同步操作时,程序将等待该操作完成,然后才执行下一段代码。这种模式被称为同步模式。在同步模式下,程序必须等待操作完成之后才能继续执行下一步操作。

异步:

在异步模式下,程序执行操作时,不需要等待该操作完成,而是可以继续执行其他操作。当该操作完成后,程序将通知其结果。这使得程序可以执行多个操作而不必等待每个操作完成。异步操作通常使用回调函数来处理操作结果。

在 Python 中,可以使用 async 和 await 关键字来实现异步操作。async 关键字用于定义异步函数,而 await 关键字用于等待异步函数的结果。异步函数通常返回一个协程对象,该对象可以在 await 关键字后使用。

另外,Python 还提供了 asyncio 模块来实现异步操作,该模块提供了事件循环和协程的支持。使用事件循环可以管理多个协程,而协程可以在事件循环中运行,以实现非阻塞的 I/O 操作。

二、Python中的堵塞非堵塞

在 Python 中,堵塞和非堵塞通常是指 I/O 操作的模式。

堵塞:

当程序执行 I/O 操作时,程序将等待 I/O 操作完成后再执行接下来的代码。这种模式被称为堵塞模式。在这种模式下,直到 I/O 操作完成之前,程序无法执行其他任务。

非堵塞:

在非堵塞模式下,程序执行 I/O 操作时,如果操作无法立即完成,则程序会立即返回,而不会等待操作完成。这使得程序可以执行其他任务,而不会被阻塞等待 I/O 操作完成。

在 Python 中,可以使用 socket 模块的 setblocking() 方法来设置套接字的堵塞和非堵塞模式。默认情况下,套接字是堵塞模式的。使用 setblocking(False) 将套接字设置为非堵塞模式。

另外,Python 还提供了 select、poll 和 epoll 等模块来实现非堵塞 I/O 操作,这些模块可以监视多个套接字的状态,并在有可读或可写数据时通知程序。这种方式可以使程序避免使用多线程或多进程来处理并发请求。

三、Python中的回调

在Python中,回调是一种常见的编程模式,用于异步或事件驱动编程。回调函数是一个函数对象,它被传递给其他函数作为参数,以便在完成某个任务时被调用。

回调函数通常在以下情况下使用:

  1. 异步编程:在异步编程中,回调函数用于在任务完成时通知程序,而不是等待任务完成。

例如,当使用Python的asyncio库时,可以定义一个回调函数,以便在异步任务完成时执行特定的操作。例如,当异步任务完成时,可以发送一条电子邮件或存储结果。

  1. 事件驱动编程:在事件驱动编程中,回调函数用于响应用户操作或系统事件。

例如,在Python的GUI编程中,可以定义回调函数,以便在用户单击按钮或输入文本时执行特定的操作。这些回调函数通常被绑定到GUI元素上,这样当用户与GUI元素交互时,就会自动调用回调函数。

总之,回调函数是Python中一种常见的编程模式,用于异步或事件驱动编程。通过使用回调函数,可以使程序更加灵活和可扩展。

示例
在 Python 中,使用 asyncio 库可以实现异步编程,而回调函数则是 asyncio 实现异步编程的基础。

在 asyncio 中,回调函数通常在以下情况下使用:

  1. 当一个异步任务完成时,可以通过调用回调函数来处理任务返回的结果。
import asynciodef callback(future):print("Task completed: {}".format(future.result()))async def coroutine():print("Start coroutine...")await asyncio.sleep(1)print("Coroutine completed.")return "Coroutine result."if __name__ == "__main__":loop = asyncio.get_event_loop()future = asyncio.ensure_future(coroutine())future.add_done_callback(callback)loop.run_until_complete(future)loop.close()

在上面的代码中,我们定义了一个回调函数 callback,它将在异步任务完成时被调用。我们使用 asyncio.ensure_future 来创建一个 Future 对象,然后使用 add_done_callback 将回调函数与 Future 对象关联起来。当任务完成时,callback 函数将被调用,并打印任务的返回结果。

  1. 当一个异步任务发生异常时,可以通过调用回调函数来处理异常。
import asynciodef callback(future):if future.exception() is not None:print("Task error: {}".format(future.exception()))else:print("Task result: {}".format(future.result()))async def coroutine():print("Start coroutine...")await asyncio.sleep(1)raise ValueError("Coroutine error.")print("Coroutine completed.")return "Coroutine result."if __name__ == "__main__":loop = asyncio.get_event_loop()future = asyncio.ensure_future(coroutine())future.add_done_callback(callback)loop.run_until_complete(future)loop.close()

在上面的代码中,我们将回调函数 callbackFuture 对象关联起来。当异步任务发生异常时,callback 函数将被调用,并打印异常信息。如果异步任务没有发生异常,则打印任务的返回结果。

总之,回调函数在 asyncio 中是一种非常重要的编程模式。通过使用回调函数,可以轻松地处理异步任务的返回结果和异常信息,使异步编程更加灵活和可扩展。

四、异步编程

Python 的异步编程可以使用 asyncio 模块来实现。在 asyncio 中,我们可以使用协程来实现异步编程。

具体步骤如下:

  1. 安装 asyncio 模块:

pip install asyncio

  1. 创建一个协程函数:
async def my_coroutine():# 异步操作的代码# 在这里可以使用异步 API,如 asyncio.sleep()
  1. 在主函数中创建事件循环,并添加协程:
import asyncioasync def my_coroutine():# 异步操作的代码loop = asyncio.get_event_loop()
loop.run_until_complete(my_coroutine())
  1. 在协程中使用异步 API:
import asyncioasync def my_coroutine():# 异步操作的代码await asyncio.sleep(1)  # 异步等待 1 秒钟loop = asyncio.get_event_loop()
loop.run_until_complete(my_coroutine())
  1. 使用 asyncio.wait() 函数同时等待多个协程的完成:
import asyncioasync def coroutine1():# 异步操作的代码async def coroutine2():# 异步操作的代码async def coroutine3():# 异步操作的代码loop = asyncio.get_event_loop()
tasks = [coroutine1(), coroutine2(), coroutine3()]
loop.run_until_complete(asyncio.wait(tasks))

以上就是 Python 异步编程的基本步骤。在实际应用中,我们还可以使用 async with 和 async for 等语法来进行更加复杂的异步操作。

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

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

相关文章

【OS】操作系统中,页框/页帧见解

文章目录 页框大小的取决因素页框大小的查询不同大小的页框,适用于哪些场景? 页框大小的取决因素 页框(Page Frame)是指操作系统中用于存储页面的物理内存块,其大小通常由操作系统的设计和硬件架构决定。在现代计算机…

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】

😀前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的…

docker 删除镜像文件

docker 容器里面太多镜像,D盘满了 四 查看和移除镜像 1 查看镜像 docker images 2 移除镜像命令 docker rmi 镜像名称 # 只输入前四位即可 五 实际有效操作 清除所有不使用的资源 docker system prune 这个命令将会删除所有不使用的镜像、容器和数据卷等资…

js 动态设置transformOrigin

transformOrigin属性用于指定元素变换的原点。 // 获取要设置的元素 const element document.getElementById(your-element-id);// 设置transformOrigin属性 element.style.transformOrigin 50% 50%; // 以元素中心为原点// 或者使用变量来设置 const x 0; // x坐标 const …

后端进阶之路——深入理解Spring Security配置(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

python操作数据库

python操作数据库 首先安装数据插件 pip install pymysqlfrom pymysql import Connection # 引入数据库第三方包# 创建链接 conn Connection(host"localhost", # 主机名ipport3306,user"root",# 用户名password"123456" # 密码 )print(con…

【STM32RT-Thread零基础入门】 2. 新建RT-Thread项目

硬件:STM32F103ZET6、ST-LINK、usb转串口工具 文章目录 前言一、新建RT-Thread项目二、项目结构三、构建项目四、下载程序(调试器下载)五、终端交互总结 前言 RT-Thread的全称是Real Time Thread,顾名思义,它是一个嵌…

UE中低延时播放RTSP监控视频解决方案

第1章 方案简介 1.1 行业痛点 在各种智慧城市、智慧社区、智慧水利、智慧矿山等数字孪生项目中,经常使用通UE来开发三维可视化场景。在这些场景中通常都需要把现场的各种监控视频在UE的可视化场景中接入,主要包含海康威视、大华、宇视、华为等众多监控…

如何理解容量测试?如何做容量测试?

1、如何理解容量测试? 容量测试,是性能测试里的一部分,它的目的是测量系统的最大容量,为系统扩容、性能优化提供参考,节省成本投入,提高资源利用率。就是运用各种方法和工具在这种复杂的情况下去不断验证容…

Android JNI--C语言基础

1, #include 相当于java的导包操作 例如&#xff1a;#include <stdio.h> <> 代表寻找系统的资源 “” 代表寻找我们自己写的资源 .h .hpp(声明文件 头文件) .c .cpp &#xff08;实现文件&#xff09; 2&#xff0c;代码结构 int main() { // 函数的主入…

Rust 编程小技巧摘选(8)

目录 Rust 编程小技巧(8) 1. 取整函数 floor() 2. 取整函数ceil() 3. 取整函数 round() 4. 保留小数位数 5. 字符串转整数 unwrap() unwrap_or() Rust 编程小技巧(8) 1. 取整函数 floor() floor函数对浮点数进行向下取整 示例代码&#xff1a; fn main() {let x: …

[C++项目] Boost文档 站内搜索引擎(5): cpphttplib实现网络服务、html页面实现、服务器部署...

在前四篇文章中, 我们实现了从文档文件的清理 到 搜索的所有内容: 项目背景: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…文档解析、处理模块parser的实现: &#x1fae6;[C项目] Boost文档 站内搜索引擎(2): 文档文本解析模块…

PAT 1067 Sort with Swap(0, i)

Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the followi…

0基础学习VR全景平台篇 第80篇:Insta360 影石如何直播推流

一、下载Insta360 Pro APP 1、手机进入Insta360官网Insta360 | Action Cameras | 360 Cameras | VR Cameras&#xff0c;页面往下滑动到Insta360 Pro2相机处&#xff0c;点击相机图片进入详情页。详情页继续下滑到到手机APP处&#xff0c;根据自己的手机系统选择对应的客户端进…

计算机网络(6) --- https协议

计算机网络&#xff08;5&#xff09; --- http协议_哈里沃克的博客-CSDN博客http协议https://blog.csdn.net/m0_63488627/article/details/132089130?spm1001.2014.3001.5501 目录 1.HTTPS的出现 1.HTTPS协议介绍 2.补充概念 1.加密 1.解释 2.原因 3.加密方式 对称加…

【Linux】网络基础1

文章目录 网络基础11. 计算机网络背景1.1 网络发展 2. 认识协议2.1 网络协议2.2 OSI七层模型2.3 TCP/IP五层&#xff08;或四层&#xff09;模型 3. 网络传输基本流程3. 1 数据报封装和分用 4. 网络中的地址管理4.1 认识IP地址 5. 认识MAC地址 网络基础1 1. 计算机网络背景 1…

Flink-串讲面试题

1. 概念 有状态的流式计算框架 可以处理源源不断的实时数据&#xff0c;数据以event为单位&#xff0c;就是一条数据。 2. 开发流程 先获取执行环境env&#xff0c;然后添加source数据源&#xff0c;转换成datastream&#xff0c;然后使用各种算子进行计算&#xff0c;使用s…

数据结构 | 树的定义及实现

目录 一、树的术语及定义 二、树的实现 2.1 列表之列表 2.2 节点与引用 一、树的术语及定义 节点&#xff1a; 节点是树的基础部分。它可以有自己的名字&#xff0c;我们称作“键”。节点也可以带有附加信息&#xff0c;我们称作“有效载荷”。有效载荷信息对于很多树算法…

【学习FreeRTOS】第5章——FreeRTOS任务挂起与恢复

1.任务的挂起与恢复的API函数 vTaskSuspend() ——挂起任务&#xff08;类似暂停&#xff0c;可恢复&#xff0c;但删除任务&#xff0c;无法恢复&#xff09;vTaskResume() ——恢复被挂起的任务xTaskResumeFromISR()—— 在中断中恢复被挂起的任务 1.1.任务挂起函数vTaskSu…

leetcode19. 删除链表的倒数第 N 个结点

题目&#xff1a;leetcode19. 删除链表的倒数第 N 个结点 描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 思路&#xff1a; 让前面的节点比后面的节点先走n1步&#xff0c;因为从链表的尾节点的下一个节点开始&…