一、多线程是什么?
多线程就是让程序同时干多件事,而不是一件做完再做下一件,适合适合 I/O 密集型 任务如:网络请求、文件读写、数据库操作等。
二、线程同步与优先级队列
线程同步:当多个线程同时访问共享资源 (比如一个队列、一个变量)时,如果不加控制,就会出现数据错乱(竞态条件)。线程同步 = 让线程按照某种规则有序地访问共享资源,避免冲突。最常见的同步工具就是锁(Lock) 。但锁只是最底层的机制,更高级的同步工具(如Queue)在内部已经帮你用好锁了。
优先级队列:普通队列是 FIFO (先进先出),优先级队列是 按优先级出队 ,优先级高的任务先执行(数字越小优先级越高,类似 (priority, data))。在 Python 中,queue.PriorityQueue 就是一个线程安全的优先级队列。
三、代码理解锁

上面这个类必须用锁 ,否则两个线程同时执行 append 可能导致列表内部状态损坏,或者两个线程同时 pop 可能拿走同一个元素。
四、代码实现优先级队列。
线程安全优先级队列(无需手动实现):

PriorityQueue内部自动加锁 :多个线程同时put或get是安全的,不需要手动Lock。- 元素格式 :
(priority, data),priority 越小越先出队。如果 priority 相同,则按插入顺序(先进先出)。 task_done():告诉队列一个任务已完成,配合queue.join()可以等待所有任务完成。- 阻塞行为 :如果队列为空,
get()会阻塞直到有元素;put()默认不会阻塞(可设置block=True, timeout
手动实现线程安全优先级队列: 
heapq模块 :提供堆队列算法,heappush和heappop保证最小的 priority 在堆顶。self._lock:基础锁,但这里不直接使用,而是交给Condition管理。Condition(self._lock):条件变量,内部封装了锁。with self._cv相当于先获得锁,代码块结束后释放锁。wait():释放锁并将线程挂起,直到被notify()唤醒。被唤醒后,线程会重新获取锁并继续。notify():唤醒一个正在wait()的线程(如果有多个,只唤醒一个)。while not self._heap:防止"虚假唤醒"。即使被唤醒,也要再次检查队列是否真的非空。
PS:优先级队列的核心要素在数据结构、线程安全、阻塞/通知机制,通常用堆(heapq)或列表排序实现优先级;依赖Lock或Condition保护共享数据;用Condition或Queue内置的阻塞实现生产-消费协调。
五、多线程优先级队列在Agent中的应用
在真实的 AI Agent 系统中,常常需要同时处理来自多个用户的请求,并且某些请求(比如 VIP 用户的指令、紧急的系统任务)应该优先 执行。这时候,多线程 负责并发执行任务,优先级队列 负责给任务排序,两者结合就能构建一个高效且灵活的 Agent 调度器。下面我们设计一个客服 AI Agent 的简化模型:
- 用户请求被放入一个优先级队列(VIP 用户优先级高,普通用户优先级低)。
- 多个工作线程同时从队列中取任务并处理(调用模拟的 LLM 或工具)。
- 高优先级的请求会插队,比后发来的普通请求更快得到处理。
python
import threading
import time
from queue import PriorityQueue
from concurrent.futures import ThreadPoolExecutor
import random
# 模拟 AI Agent 处理一个用户请求
def handle_request(user_id, message, priority):
"""模拟处理请求,耗时随机 1~3 秒"""
print(f"[开始] 优先级 {priority} - 用户 {user_id}: {message}")
time.sleep(random.uniform(1, 3)) # 模拟 LLM 推理或工具调用
print(f"[完成] 优先级 {priority} - 用户 {user_id}")
# 这里可以返回结果,本示例只打印
# 生产者:不断接收用户请求(模拟外部输入)
def producer(request_queue):
"""模拟接收来自不同用户的请求,按随机优先级放入队列"""
# 模拟一批请求: (优先级, 用户ID, 消息)
test_requests = [
(1, "VIP_Alice", "帮我订今晚的餐厅"), # 优先级1 最高
(3, "Normal_Bob", "天气怎么样"), # 优先级3
(2, "VIP_Charlie", "我的订单出错了"), # 优先级2
(4, "Normal_David", "讲个笑话"), # 优先级4 最低
(1, "VIP_Eve", "立刻联系客服"), # 优先级1
]
for priority, uid, msg in test_requests:
request_queue.put((priority, uid, msg))
print(f"[队列] 加入请求: 优先级{priority} 用户{uid}")
time.sleep(0.2) # 模拟请求到达有时间间隔
# 消费者:工作线程函数
def worker(worker_id, request_queue):
while True:
try:
# 从优先级队列中取出最高优先级的任务(阻塞直到有任务)
priority, uid, msg = request_queue.get(timeout=5) # 5秒超时退出
handle_request(uid, msg, priority)
request_queue.task_done()
except Exception:
# 队列为空超时,退出线程
break
def main():
# 创建优先级队列(数字越小优先级越高)
request_queue = PriorityQueue()
# 启动生产者线程(接收请求)
producer_thread = threading.Thread(target=producer, args=(request_queue,))
producer_thread.start()
# 启动 3 个工作线程,并发处理请求
with ThreadPoolExecutor(max_workers=3) as executor:
# 提交 3 个 worker 任务
futures = [executor.submit(worker, i, request_queue) for i in range(3)]
# 等待生产者线程结束(所有请求都已放入队列)
producer_thread.join()
# 等待队列中所有任务被处理完
request_queue.join()
# 由于队列已空,可以手动让 worker 退出(通过超时或设置标志)
# 这里简单等待几秒让 worker 自然超时退出
time.sleep(1)
print("所有请求处理完毕")
if __name__ == "__main__":
main()

六、本例中多线程与优先级队列如何协作

七、在真实AI Agent中的拓展应用
API 限流与退避: 工作线程调用第三方 API 时,可能遇到速率限制。可以给每个任务增加一个"重试次数"字段,失败后降低优先级并重新入队。
长短期任务分离: 耗时短的任务(如简单查询)可以赋予较高优先级,长时间任务(如数据分析)优先级低,避免阻塞其他用户。
动态优先级调整: 用户等待时间过长时,自动提升其请求的优先级(类似操作系统的动态优先级调度)。
多队列分级: 可以设置多个优先级队列(如 0~9),每个队列用独立的工作线程池,确保关键任务资源隔离。