Python 多线程编程入门 零基础详解

原始人用心编程 2026-04-29 22:47:51

一、前言

前面我们已经把 Python 基础、函数、模块、OOP、装饰器、生成器、魔术方法、随机数、深浅拷贝全部学完。到了进阶阶段,就必须掌握多线程

多线程适合:

  • 批量下载、爬虫并发
  • 同时执行多个任务
  • 等待延时、IO 阻塞任务提速

 

二、什么是多线程

  • 程序至少有一个主线程
  • 多线程:一个程序同时干多件事
  • 适合 IO 密集型:网络请求、文件等待、延时任务
  • Python 多线程不适合大量 CPU 计算(GIL 全局解释器锁限制)

三、线程模块导入

Python 内置模块,不用安装

python

运行

import threading
import time

四、创建线程两种方式

方式一:函数式(最简单)

import threading
import time

def task(name):
    print(f"子线程 {name} 开始执行")
    time.sleep(2)
    print(f"子线程 {name} 执行完毕")

# 创建线程
t1 = threading.Thread(target=task, args=("线程1",))
t2 = threading.Thread(target=task, args=("线程2",))

# 启动线程
t1.start()
t2.start()

方式二:继承类创建线程

重写 run() 方法

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f"子线程 {self.name} 开始")
        time.sleep(1.5)
        print(f"子线程 {self.name} 结束")

t1 = MyThread("A")
t2 = MyThread("B")
t1.start()
t2.start()

五、join () 等待线程执行完毕

不加 join 主线程会先走,不会等子线程

import threading
import time

def work():
    time.sleep(3)
    print("子线程任务完成")

t = threading.Thread(target=work)
t.start()

# 主线程等待子线程结束再往下走
t.join()
print("主线程结束")

六、守护线程 daemon

守护线程:主线程退出,守护线程直接跟着结束,不等它跑完

import threading
import time

def daemon_task():
    while True:
        print("守护线程运行中...")
        time.sleep(1)

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

time.sleep(3)
print("主线程退出,守护线程也停止")

七、多线程共享变量与线程安全

多个线程同时改同一个变量,会出现数据错乱

import threading

num = 0

def add():
    global num
    for _ in range(100000):
        num += 1

t1 = threading.Thread(target=add)
t2 = threading.Thread(target=add)
t1.start()
t2.start()
t1.join()
t2.join()

print("最终数值:", num)
# 结果大概率不是 200000,出现线程不安全

八、线程锁 Lock 解决数据错乱

加锁保证同一时间只有一个线程修改数据

import threading

num = 0
lock = threading.Lock()

def add():
    global num
    for _ in range(100000):
        lock.acquire()   # 加锁
        num += 1
        lock.release()   # 解锁

t1 = threading.Thread(target=add)
t2 = threading.Thread(target=add)
t1.start()
t2.start()
t1.join()
t2.join()

print("加锁后数值:", num)
# 结果正常等于 200000

九、综合实战案例:多线程批量任务

import threading
import time

def task(idx):
    print(f"任务 {idx} 开始")
    time.sleep(2)
    print(f"任务 {idx} 完成")

if __name__ == "__main__":
    thread_list = []
    for i in range(3):
        t = threading.Thread(target=task, args=(i+1,))
        thread_list.append(t)
        t.start()

    # 等待所有线程结束
    for t in thread_list:
        t.join()

    print("所有任务全部结束")

十、总结与学习心得

本篇学习了 Python 多线程核心知识点:线程概念、两种创建方式、start 启动、join 等待、守护线程 daemon、多线程共享变量、线程锁 Lock 解决安全问题。

多线程是编程进阶必备技能,在爬虫、批量处理、自动化脚本、后台任务中大量使用。

...全文
24 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

151

社区成员

发帖
与我相关
我的任务
社区描述
这里专为新疆政法学院的探索者而建,英雄不问出处。起跑线是起点,热忱与坚持为加速器,无论bug缠身的项目,还是攻克的算法顿悟,每滴汗水皆被珍藏。执炬前行,终将照亮彼此峰顶,我们携手同行。
课程设计笔记经验分享 高校 新疆·图木舒克市
社区管理员
  • 雲中203
  • SHAO060706
  • 三叶草.
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

英雄不问出处

试试用AI创作助手写篇文章吧