Python 并发必备:`threading` 必须掌握的核心 API 与示例

如果你只想记住最少却最常用threading 知识,看这篇就够了!文末附一键运行脚本。


1. 创建并启动线程:Thread(target=..., args=...)

import threading

def worker(num):
    print(f"Worker {num} 正在执行")

threads = []
for i in range(3):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()          # 等待所有线程结束
print("全部线程已完成")

2. 守护线程:daemon=True

守护线程不会阻止主程序退出,适合做心跳、日志等后台任务。

import threading, time

def background():
    while True:
        print("后台心跳...")
        time.sleep(1)

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

print("主线程结束即退出,不会等守护线程")

3. 等待线程结束:join()

import threading, time

def task():
    time.sleep(2)
    print("子线程完成")

t = threading.Thread(target=task)
t.start()
t.join()          # 阻塞直到子线程结束
print("主线程继续")

4. 线程安全锁:Lock + with

import threading

counter = 0
lock = threading.Lock()

def safe_incr():
    global counter
    for _ in range(100000):
        with lock:           # 等价于 acquire()/release()
            counter += 1

threads = [threading.Thread(target=safe_incr) for _ in range(2)]
for t in threads: t.start()
for t in threads: t.join()

print("最终 counter =", counter)   # 必为 200000

5. 线程间通信:Event

import threading, time

event = threading.Event()

def waiter():
    print("等待事件触发...")
    event.wait()               # 阻塞
    print("收到事件,继续执行")

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

time.sleep(2)
event.set()                    # 触发
t.join()

6. 获取当前线程名:threading.current_thread().name

import threading

def whoami():
    print("当前线程:", threading.current_thread().name)

threading.Thread(target=whoami, name="worker-1").start()

7. 一键运行脚本(保存为 threading_must_know.py

"""
Python threading 必会示例合集
运行:python threading_must_know.py
"""
import threading, time

# 1. 创建线程
def worker(n):
    print(f"[{threading.current_thread().name}] 任务 {n}")

ts = [threading.Thread(target=worker, args=(i,)) for i in range(3)]
for t in ts: t.start()
for t in ts: t.join()

# 2. 守护线程
def daemon_task():
    while True:
        time.sleep(1)
threading.Thread(target=daemon_task, daemon=True).start()

# 3. 锁示例
count = 0
lock = threading.Lock()

def safe_add():
    global count
    for _ in range(10000):
        with lock:
            count += 1

threads = [threading.Thread(target=safe_add) for _ in range(2)]
for t in threads: t.start()
for t in threads: t.join()
assert count == 20000
print("锁验证通过 ✅")

# 4. Event 示例
evt = threading.Event()
def waiter():
    evt.wait()
    print("Event 触发,waiter 继续")
threading.Thread(target=waiter).start()
time.sleep(1)
evt.set()

总结卡片(背诵用)

API记忆口诀示例
创建线程Thread(target, args)t = Thread(target=f, args=(1,)); t.start()
等线程结束t.join()t.join()
守护线程daemon=TrueThread(..., daemon=True)
线程安全with lockwith threading.Lock(): ...
线程通信Event().set / waite.set(); e.wait()
当前线程名current_thread().namethreading.current_thread().name

把这些示例跑一遍,你就掌握了 threading 90% 的日常用法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值