Python编程—从多线程到异步IO的终极对决


包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】!

一、并发模型:Python的"三驾马车"

Python提供三种核心并发模型,各有千秋:
  • 多线程:适合IO密集型任务
  • 多进程:适合CPU密集型任务
  • 异步IO:万级并发王者
性能对比:
  • 模型
  • 切换开销
  • 内存占用
  • 适用场景
  • 多线程
文件IO/网络请求
  • 多进程
CPU计算/隔离性要求
  • 异步IO
  • 极低
  • 极低
  • 高并发/长连接服务

二、基础篇:模型原理与基础用法

1. 多线程
import threading
def download(url):
    # 模拟下载任务
    resp = requests.get(url)
    with lock:
        total_size += len(resp.content)
lock = threading.Lock()
total_size = 0
urls = ["http://example.com"]*5
threads = []
for url in urls:
    t = threading.Thread(target=download, args=(url,))
    threads.append(t)
    t.start()
for t in threads:
    t.join()
print(f"总下载量:{total_size} bytes")
2. 多进程
from multiprocessing import Pool
def process_data(data):
    # CPU密集型计算
    return sum(i*i for i in data)
if __name__ == "__main__":
    with Pool(4) as p:
        results = p.map(process_data, [[1,2,3]]*10)
    print(f"计算结果:{sum(results)}")
3. 异步IO
import asyncio
import aiohttp
async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            return await resp.text()
async def main():
    urls = ["http://example.com"]*5
    tasks = [fetch(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(f"获取到{len(results)}个响应")
asyncio.run(main())

三、进阶篇:模型核心挑战

1. 多线程:GIL锁与竞态条件
# 错误:未使用锁导致数据竞争
counter = 0
def increment():
    global counter
    for _ in range(1000):
        counter += 1  # 非原子操作!
threads = []
for _ in range(10):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()
for t in threads:
    t.join()
print(f"最终计数:{counter}")  # 可能小于10000
# 修复:使用Lock
lock = threading.Lock()
def safe_increment():
    global counter
    with lock:
        counter += 1
2. 多进程:进程间通信
from multiprocessing import Process, Queue
def worker(q):
    q.put("进程间消息")
if __name__ == "__main__":
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()
    print(q.get())  # 输出:进程间消息
    p.join()
3. 异步IO:避免阻塞事件循环
# 错误:在协程中执行同步阻塞代码
async def bad_practice():
    time.sleep(5)  # 阻塞整个事件循环!
    return "done"
# 修复:使用异步版本
async def good_practice():
    await asyncio.sleep(5)
    return "done"

四、实战场景:模型选型指南

场景1:Web服务器
  • 多线程:Flask/Django开发服务器
  • 异步IO:FastAPI + Uvicorn(支持万级并发)
  • 多进程:Gunicorn + 同步框架(利用多核CPU)
场景2:数据采集
  • 多线程:爬虫下载多个网页
  • 异步IO:实时采集传感器数据
  • 多进程:处理大型CSV文件(CPU密集型解析)
场景3:实时系统
  • 多线程:GUI程序保持响应
  • 异步IO:WebSocket服务器处理长连接
  • 多进程:隔离关键计算任务
    图片

总结

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!
  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费Python编程—从多线程到异步IO的终极对决_第1张图片

你可能感兴趣的:(python,数据库,redis,Python学习,学习,开发语言,Python编程)