并发、并行、同步和异步(名词解释)
并发
并发指的是 一个 CPU 同时处理多个程序,但是在同一时间点只会处理其中一个。并发的核心是:程序切换。它意味着操作系统会在非常短的时间内快速地在多个程序之间切换,使得每个程序都有机会得到执行
并行
并行指的是多个 CPU 同时处理多个程序,同一时间点可以处理多个。
同步
同步:执行 IO 操作时,必须等待执行完成才得到返回结果。
异步
异步编程是一种编程范式,它允许程序在等待某个操作完成时继续执行其他任务。这可以提高程序的效率,尤其是在I/O密集型操作(如网络请求、文件读写)中。在Python中,异步编程通常通过 asyncio
库来实现。
进程,线程,协程的区别
多进程通常利用的是多核 CPU 的优势,同时执行多个计算任务。每个进程有自己独立的内存管理,所以不同进程之间要进行数据通信比较麻烦。
多线程是在一个 cpu 上创建多个子任务,当某一个子任务休息的时候其他任务接着执行。多线程的控制是由 python 自己控制的。 子线程之间的内存是共享的,并不需要额外的数据通信机制。但是线程存在数据同步问题,所以要有锁机制。
协程是一种编程结构,允许一个函数在执行过程中暂停并保存当前状态,以便稍后可以从中恢复执行。在Python中,协程通常使用 async/await
语法来实现。当一个协程使用 await
关键字调用另一个协程时,它会暂停当前协程的执行,直到被调用的协程完成。
async、await和asyncio的介绍和使用
在Python中,async和await是一对配合使用的关键字,配合使用可以实现 协程 的特性,在配合asyncio编写异步代码可实现并发效果
async关键字:
async用于定义一个异步函数,表明该函数是一个协程,可以在其中使用await关键字等待其他异步操作完成
异步函数的执行不会阻塞事件循环,而是会立即返回一个协程对象。
await关键字:
await用于在异步函数内部等待其他协程执行完成,后面通常跟着一个需要等待的协程对象
当遇到await关键字时,事件循环会挂起当前的协程,并执行其他协程任务,直到等待的协程完成后才会恢复执行当前协程
asyncio
asyncio 是 python 的一个内置库,主要用于编写异步代码,其中协程是实现异步编程的关键。
示例
在异步函数中,只有两个或者多个协程任务都被await调用时,才能并行这些协程任务(无论协程任务在此异步函数中的什么位置),而 print 或者其他没有被await调用的函数,都是阻塞操作,都需要协程任务完成之后,它们才能执行
import asyncio
import time
async def async_function():
print("开始异步操作-1")
await asyncio.sleep(5) # 模拟异步I/O操作
print("异步操作完成-1")
return "异步操作结果-1"
async def another_async_function():
print("开始异步操作-2")
await asyncio.sleep(5) # 模拟另一个异步I/O操作
print("异步操作完成-2")
return "异步操作结果-2"
def sync_func():
print('这个函数是同步操作(阻塞操作,会让程序按顺序执行,造成堵塞)\n')
async def main():
# 创建两个异步任务的协程
task1 = asyncio.create_task(async_function())
task2 = asyncio.create_task(another_async_function())
# 等待异步任务完成
result1 = await task1
print('\n这个 print 是同步操作(阻塞操作,会让程序按顺序执行,造成堵塞)')
sync_func()
# 等待异步任务完成
result2 = await task2
print(result1, result2)
# 运行事件循环
asyncio.run(main())
评论区