python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 异步与同步

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

作者:子墨将

在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.apply_async换成pool.apply,那么就是同步阻塞的效果,water任务执行时会阻塞主进程,直到任务完成才会继续执行后续代码。

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

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

您可能感兴趣的文章:
阅读全文