Python 中的异步与同步深度解析(实践记录)

 更新时间:2025年03月28日 16:22:36   作者:子墨将  
在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际代码示例来加深理解,感兴趣的朋友一起看看吧

Python中的异步与同步:深度解析与实践

在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键。这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际代码示例来加深理解。

异步与同步的定义

异步

异步意味着多任务处理,任务之间的执行没有严格的先后顺序,甚至可以同时运行。这就好比你一边听音乐,一边浏览网页,听音乐和浏览网页这两个任务之间互不干扰,多条任务的执行路径同时存在,程序有多个“主线”并行处理任务。

同步

同步同样是处理多任务,但任务之间有严格的先后顺序。只有前一个任务执行完成,下一个任务才能开始。这类似于你排队买东西,必须一个人买完,下一个人才能接着买,整个过程只有一条“主线”。

阻塞与非阻塞的概念

阻塞

从调用者的角度来看,如果在调用某个操作时,程序被卡住,无法继续向下执行,必须等待该操作完成,这种情况就是阻塞。比如你打电话叫外卖,在等待外卖送达的这段时间里,你什么其他事都做不了,只能干等着,这就是“阻塞”状态。

非阻塞

当调用某个操作时,程序不会被卡住,能够继续向下执行,无需等待该操作完成,这就是非阻塞。还是以叫外卖为例,你下单后可以继续做自己的事情,不用一直等着外卖,这就是“非阻塞”状态。

同步阻塞与异步非阻塞示例

下面通过Python代码来具体展示异步和同步的工作方式。这里我们使用multiprocessing模块中的Pool来创建进程池,实现多任务处理。

from multiprocessing import Pool
import time
import os
def water():
    """烧水"""
    print(f"子进程 pid={os.getpid()}")
    for i in range(5):
        print("正在烧水中")
        time.sleep(0.5)
    return "水烧开了"
def handle_water(message):
    """接收烧开水的信息"""
    print(f"进程pid={os.getpid()} 收到了异步任务的结束信息: {message}")
pool = Pool(3)
print(f"主进程 pid={os.getpid()}")
for i in range(3):
    print("打游戏")
    time.sleep(0.5)
# 回调
pool.apply_async(water, callback=handle_water)  # 异步添加任务
for i in range(20):
    print("打游戏")
    time.sleep(0.5)
pool.close()
pool.join()

在这段代码中:

  • 首先创建了一个进程池Pool,最大进程数为3。
  • 主进程先执行一段“打游戏”的操作,循环3次,每次间隔0.5秒。
  • 然后使用pool.apply_async方法异步地添加water任务到进程池,并设置了回调函数handle_waterwater任务模拟烧水过程,会打印当前子进程ID并每隔0.5秒输出“正在烧水中”,完成后返回“水烧开了”。handle_water函数用于接收water任务完成后的信息并打印。
  • 接着主进程继续执行“打游戏”操作,循环20次,每次间隔0.5秒。这期间,water任务在后台异步执行。
  • 最后,调用pool.close()关闭进程池,不再接受新任务,pool.join()让主进程等待所有子进程完成任务后再结束。

通过这个示例,可以清晰地看到异步任务在后台执行,不会阻塞主进程的其他操作,体现了异步非阻塞的特性。如果将pool.apply_async换成pool.apply,那么就是同步阻塞的效果,water任务执行时会阻塞主进程,直到任务完成才会继续执行后续代码。

理解异步、同步、阻塞和非阻塞的概念,能帮助开发者根据实际需求优化程序性能,合理利用系统资源,让程序运行得更加高效和灵活。无论是处理I/O密集型任务,还是CPU密集型任务,选择合适的执行方式都是关键。

到此这篇关于Python 中的异步与同步:解析与实践的文章就介绍到这了,更多相关Python 异步与同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 实现简单的计算器(gui界面)

    python 实现简单的计算器(gui界面)

    这篇文章主要介绍了python 如何实现简单的计算器,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • Python计算程序运行时间的方法

    Python计算程序运行时间的方法

    这篇文章主要介绍了Python计算程序运行时间的方法,分别记录起始时间与结束时间,计算两者之间的差值来获得程序的运行时间,需要的朋友可以参考下
    2014-12-12
  • Python字符串格式化

    Python字符串格式化

    Python字符串格式化操作符(%)只适用于字符串类型,非常类似于C 语言里面的printf()函数的字符串格式化,甚至所用的符号都一样,都用百分号(%),并且支持所有printf()式的格式化操作。
    2015-06-06
  • 手把手教你用Python打造互动式中秋节庆祝小程序

    手把手教你用Python打造互动式中秋节庆祝小程序

    中秋节将至,本文提供了一个使用Python开发的中秋节庆祝小程序教程,通过简单的步骤,您可以创建一个具有节日祝福、互动式灯谜游戏和模拟中秋明月动态背景的小程序,文章详细介绍了程序的功能、实现步骤以及如何运行程序,需要的朋友可以参考下
    2024-09-09
  • Python+opencv+pyaudio实现带声音屏幕录制

    Python+opencv+pyaudio实现带声音屏幕录制

    今天小编就为大家分享一篇Python+opencv+pyaudio实现带声音屏幕录制,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python实现DEM数据的阴影生成的方法

    python实现DEM数据的阴影生成的方法

    这篇文章主要介绍了python实现DEM数据的阴影生成的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 关于Python中浮点数精度处理的技巧总结

    关于Python中浮点数精度处理的技巧总结

    双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位(8字节) 来存储一个浮点数。下面这篇文章主要给大家总结介绍了关于Python中浮点数精度处理的技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Python实现图片裁剪的两种方式(Pillow和OpenCV)

    Python实现图片裁剪的两种方式(Pillow和OpenCV)

    这篇文章主要介绍了Python实现图片裁剪的两种方式(Pillow和OpenCV),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式

    浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式

    这篇文章主要介绍了浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Flask深入了解Jinja2引擎的用法

    Flask深入了解Jinja2引擎的用法

    Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。 它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。jinja2使用BSD授权
    2022-07-07

最新评论