151
社区成员
发帖
与我相关
我的任务
分享前面我们已经把 Python 基础、函数、模块、OOP、装饰器、生成器、魔术方法、随机数、深浅拷贝全部学完。到了进阶阶段,就必须掌握多线程。
多线程适合:
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 主线程会先走,不会等子线程
import threading
import time
def work():
time.sleep(3)
print("子线程任务完成")
t = threading.Thread(target=work)
t.start()
# 主线程等待子线程结束再往下走
t.join()
print("主线程结束")
守护线程:主线程退出,守护线程直接跟着结束,不等它跑完
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,出现线程不安全
加锁保证同一时间只有一个线程修改数据
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 解决安全问题。
多线程是编程进阶必备技能,在爬虫、批量处理、自动化脚本、后台任务中大量使用。