异步编程的核心是单线程实现高并发,核心概念有协程、事件循环、非阻塞IO。它的关键逻辑是:任务执行时遇到IO操作(网络请求、文件读写),不原地等待,而是主动挂起,让CPU去执行其他任务,等IO完成后再唤醒继续执行。彻底避免了同步编程中CPU闲置的问题,用极小的资源就能处理海量并发任务。核心是协作式调度,由程序自己控制任务切换,而非操作系统强制切换,这也是它高效的根本原因。
asyncio是Python官方的异步编程框架,核心是事件循环。工作流程很简单:先创建一个事件循环,把所有协程任务注册到循环里;循环启动后,会按顺序调度任务运行;当任务遇到await关键字(异步IO操作),就会自动挂起,事件循环立刻切换执行下一个就绪任务;等之前的IO操作完成,任务会被重新唤醒,继续执行后续代码。整个过程在单线程内完成,没有线程切换的开销,专门针对IO密集型场景,实现超高并发。
协程是用户态的轻量级任务,在单线程内由程序控制切换,切换开销几乎为零,能轻松跑上万协程,不受GIL限制;线程是内核态的执行单元,由操作系统调度,切换开销大,受GIL影响,CPython多线程无法利用多核。协程是协作式切换,线程是抢占式切换。应用场景:协程适合高并发IO密集型(爬虫、web服务、接口请求);线程适合简单的IO任务,并发量不大、开发更简单的场景,无法处理超大规模并发。
GIL全称全局解释器锁,是CPython解释器的一把互斥锁。它的作用是:同一时刻,只允许一个线程执行Python字节码。这就导致Python多线程无法利用多核CPU实现真正的并行,只能并发。影响很明确:CPU密集型任务用多线程完全没用,效率甚至比单线程还低;IO密集型任务(等待时会释放GIL),多线程可以提升效率。GIL保证了Python底层的线程安全,但牺牲了多核性能,是Python多线程的核心限制。
多线程:轻量级,共享进程内存,创建销毁快、切换开销小,但受GIL限制,不能用多核;多进程:独立内存空间,每个进程有独立GIL,能充分利用多核CPU,但是创建销毁慢、开销大,进程间数据共享很麻烦。选择方式很直接:CPU密集型任务选多进程,比如大数据计算、视频处理;IO密集型小任务选多线程;高并发IO场景优先用协程,而非线程/进程。
Python用内置multiprocessing库实现多进程,用法简单。基础用法:创建Process对象,指定目标函数和参数,调用start()启动进程,join()等待进程执行完毕。批量处理任务用进程池(Pool/ProcessPoolExecutor)更高效,能自动管理进程数量,避免频繁创建销毁进程。因为进程内存独立,数据共享需要用Queue、Pipe、Manager等工具。多进程专门解决GIL限制,是CPU密集型任务的最优解,代码编写和多线程语法几乎一致。