Python进阶教程 第 7 章:并发与多线程编程
来源:     阅读:6
易浩激活码
发布于 2025-10-30 23:02
查看主页

点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!

7.1 引言

在现代编程中,并发 (Concurrency)并行 (Parallelism) 是提升性能的重大手段。

Python 提供了多种并发工具:

本章主要介绍 多线程,下一章将学习 异步编程 (asyncio)


7.2 线程基础

7.2.1 创建线程

使用 threading.Thread 创建线程。

示例:

import threadingimport timedef worker(name):
    print(f"线程 {name} 开始")
    time.sleep(2)
    print(f"线程 {name} 结束")

t1 = threading.Thread(target=worker, args=("A",))
t2 = threading.Thread(target=worker, args=("B",))

t1.start()
t2.start()

t1.join()
t2.join()
print("主线程结束")

✅ 输出结果(线程交替执行):

线程 A 开始
线程 B 开始
线程 A 结束
线程 B 结束
主线程结束

7.3 守护线程 (Daemon Thread)

示例:

def background_task():    while True:
        print("后台运行中...")
        time.sleep(1)

t = threading.Thread(target=background_task, daemon=True)
t.start()

time.sleep(3)
print("主线程结束,守护线程会被杀死")

✅ 输出结果(只运行几次后台任务后退出):

后台运行中...
后台运行中...
后台运行中...
主线程结束,守护线程会被杀死

7.4 线程同步

7.4.1 问题:竞态条件 (Race Condition)

多个线程同时修改同一变量,可能导致结果错误。

示例(错误情况):

balance = 0def deposit():    global balance    for _ in range(100000):        balance += 1t1 = threading.Thread(target=deposit)t2 = threading.Thread(target=deposit)t1.start(); t2.start()t1.join(); t2.join()print("最终余额:", balance)

✅ 结果可能小于 200000,由于多个线程同时写入,数据丢失。


7.4.2 使用 Lock 解决竞态问题

threading.Lock 可以确保同一时间只有一个线程修改共享资源。

示例:

balance = 0lock = threading.Lock()def deposit():    global balance    for _ in range(100000):        with lock:            balance += 1t1 = threading.Thread(target=deposit)t2 = threading.Thread(target=deposit)t1.start(); t2.start()t1.join(); t2.join()print("最终余额:", balance)

✅ 输出结果:

最终余额: 200000

7.5 线程池

使用
concurrent.futures.ThreadPoolExecutor 可以更方便地管理线程。

示例:

from concurrent.futures import ThreadPoolExecutorimport timedef task(n):
    time.sleep(1)    return n * nwith ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(task, [1, 2, 3, 4, 5]))

print("结果:", results)

✅ 输出结果(3 个线程并发执行,整体运行更快):

结果: [1, 4, 9, 16, 25]

7.6 全局解释器锁 (GIL)


7.7 小结

下一章我们将学习 异步编程 (asyncio),它是 Python 提供的另一种高效并发模型,特别适合网络编程。

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境
相关推荐
Vue计划-4 第三方UI组件库
Kudu与Spark 生产最佳实践
Android Framework解析
Java中高效判断数组中能否包含某个元素
IT行业最青睐的4所大学,程序员平均薪资1万5,没毕业就签走
首页
搜索
订单
购物车
我的