把“多任务”当成厨房做饭,0 基础也能秒懂!


一、故事开场
你一个人在家,要做三样吃的:

  1. 炖牛肉(40 min)
  2. 煮米饭(20 min)
  3. 榨果汁(5 min)

如果一件做完再做下一件,总耗时 65 min——这叫串行(单任务)。

能不能同时做?当然可以!这就是多任务


二、三种“同时做”的办法(对比厨房)

办法 厨房比喻 计算机里的样子 优点 缺点
多进程
Process
直接再请两个厨师,各占一个灶台,真正并行 操作系统给你多个独立厨房(内存互不干扰) 安全,一个厨房着火不影响另一个 贵(内存、CPU 占用高)
多线程
Thread
你自己分身术,炖肉时趁空档淘米、榨果汁 一个厨房,你一个人不断切换任务 省内存,切换快 要小心“踩到脚”(数据错乱),需加锁
协程
Coroutine
还是你一个人,但菜谱写得巧:炖肉期间“等待水开”时立刻跳去切水果,水开再回来 一个厨房,一个人,自己记录做到哪一步,遇到等就跳 极省资源,切换最快 只在“等”时才能跳,真正计算密集时无效

三、一句话总结

  • 进程 = 再请厨师(真并行,贵)
  • 线程 = 自己分身(快,但要锁)
  • 协程 = 菜谱写得好,空档不浪费(最省,适合网络等“等”的场景)

四、最小代码对照(0 基础也能跑)

# 1. 多进程:两个厨师同时炒
import multiprocessing as mp
def cook(name):
    for i in range(3):
        print(f"厨师{name} 炒第{i}盘菜")

p1 = mp.Process(target=cook, args=("A",))
p2 = mp.Process(target=cook, args=("B",))
p1.start(); p2.start()
p1.join();  p2.join()

# 2. 多线程:一个人切换
import threading as td
def cook(name):
    for i in range(3):
        print(f"我({name}) 炒第{i}盘菜")

t1 = td.Thread(target=cook, args=("①",))
t2 = td.Thread(target=cook, args=("②",))
t1.start(); t2.start()
t1.join();  t2.join()

# 3. 协程:菜谱巧,等就跳
import asyncio
async def cook(name):
    for i in range(3):
        print(f"协程{name} 炒第{i}盘菜")
        await asyncio.sleep(0.1)  # 遇到等待立刻跳走

asyncio.run(asyncio.gather(cook("A"), cook("B")))

跑一遍,看屏幕输出顺序,就能直观感受三种“同时做”的差异!


五、记忆口诀
进程请厨师,线程分身术,协程菜谱巧;
先学线程写小 demo,遇到性能瓶颈再换进程/协程,0 基础也能步步升级!

更多推荐