Python
多进程-Process(multiprocessing):使用multiprocessing模块实现,适合CPU密集型任务。
多线程-Thread(threading):使用threading模块实现,适合I/O密集型任务。
多协程-Coroutine使用异步编程asyncio模块实现,适合高并发的I/O操作
用线程池或进程池:可以使用Python的concurrent.futures模块创建线程池或进程池来并发读取大文件
在 多进程 场景中 "每个进程都有属于自己的GIL" ,所以在多核处理器下,多进程的运行是不会受GL影响的-使用多核处理器
多线程 场景中,Python因为 GIL 的限制
python 协程的本质是个单线程,它不能同时利用 CPU 多核资源--单核不阻塞
异步多进程" 可以解决利用多核资源。多进程 + 协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。aiomultiprocess
协程
协程 :协程需要的两个能力事件循环和任务暂停和继续
python2.5 为生成器引用.send()、.throw()、.close()方
旧协程以yield关键字为核心,
通过yield关键提供的代码执行暂停、恢复的能力,实现函数交替的执行,cpu的转让等能力
async和await是Python 3.5引入的语法,用于定义和使用协程(coroutine)。
async def 用于定义一个协程函数
await 用于等待一个协程完成
anext()是Python 3.10引入的函数,用于获取异步迭代器的下一个值。它返回一个协程对象,可以使用await等待结果
旧协程
旧协程中的实现分别是:
事件循环通过手动编写while循环代码实现
代码暂停继续执行通过yield生成器的能力实现
新协程是asyncio、async、await等关键字实现的。
新协程是基于事件循环机制实现的,核心能力包括事件循环,任务,回调机制等。三者提供的能力分别是
asyncio 提供了事件循环
async 提供了协程标识
await 提供了流程挂起能力
Linux
在Linux中,进程和线程是操作系统资源管理的基本单位。
程序
进程有自己的地址空间和资源, 进程是系统资源调度的最小单位
线程则共享进程的资源,但有自己的执行路径。线程CPU调度的最小单位
协程是用户空间的轻量级线程,它更接近于进程内部的调度-用户态的进程 户态内的上下文切换技术
ps -efT,PID 为进程 ID,SPID 为线程 ID
进程:
进程有五种状态:创建、就绪、执行、阻塞、终止
协程实现
有栈协程
多个协程要想在用户态交替运行,也必须为每个协程配备不同的栈
多个协程都隶属于同一个进程,而进程栈的位置是被操作系统提前分配好了的。
所以,为每个协程配备栈的时候,每个栈的内存范围必须在进程栈的范围内
无栈协程
无栈协程的实现也很简单,只要在切换协程之前,把当前协程的栈数据保存到堆上就可以了
协程数量也只受制于进程的堆的大小
async/await 关键字
栈协程要求在语言中引入新语法(如 async/await 关键字)。
然而,这种新语法会增加开发者编写并发代码的复杂度。
开发者需要在编程过程中手动标记(如用 async 标记异步函数并用 await 标记其调用点
绿色线程(greenlet)为有栈协程,而异步IO库如asyncio则属于无栈协程
greenlet 用 C 语言扩展保存 Python 解释器的调用栈,然后在此基础上提供了切换接口,是一种原始的有栈协程
asyncio
运行器 asyncio.run
运行器上下文管理器 class asyncio.Runner run(coro, *, context=None) close() get_loop()
底层: asyncio.get_running_loop() asyncio.get_event_loop()
asyncio.set_event_loop(loop) asyncio.new_event_loop()
loop.call_soon() 和 loop.call_later()
asyncio.run() 函数用来运行最高层级的入口点 "main()" 函数
可等待 对象有三种主要类型: 协程, 任务 和 Future
asyncio.TaskGroup.create_task() 是一个平衡了结构化并发的新选择;它允许等待一组相关任务并具有极强的安全保证
示例
aiofiles是一个异步文件操作库,
提供了一种简单而强大的方式来执行文件操作,包括打开文件、读取文件、写入文件等。aiofiles库是建立在asyncio之上的
a coroutine function: an async def function
参考
aiofiles,一个异步测试的 Python 库! https://www.cnblogs.com/pywen/p/18060771