Python-协程-进程-线程

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	 
posted @ 2024-11-21 17:14  辰令  阅读(66)  评论(0)    收藏  举报