Agent Python学习篇:多线程——让你的AI助手不再“排队等号”

一、多线程是什么?

多线程就是让程序同时干多件事,而不是一件做完再做下一件,适合适合 I/O 密集型 任务如:网络请求、文件读写、数据库操作等。

二、线程同步与优先级队列

线程同步:当多个线程同时访问共享资源 (比如一个队列、一个变量)时,如果不加控制,就会出现数据错乱(竞态条件)。线程同步 = 让线程按照某种规则有序地访问共享资源,避免冲突。最常见的同步工具就是锁(Lock) 。但锁只是最底层的机制,更高级的同步工具(如Queue)在内部已经帮你用好锁了。

优先级队列:普通队列是 FIFO (先进先出),优先级队列是 按优先级出队 ,优先级高的任务先执行(数字越小优先级越高,类似 (priority, data))。在 Python 中,queue.PriorityQueue 就是一个线程安全的优先级队列。

三、代码理解锁

上面这个类必须用锁 ,否则两个线程同时执行 append 可能导致列表内部状态损坏,或者两个线程同时 pop 可能拿走同一个元素。

四、代码实现优先级队列。

线程安全优先级队列(无需手动实现):

  • PriorityQueue 内部自动加锁 :多个线程同时 putget 是安全的,不需要手动 Lock
  • 元素格式(priority, data),priority 越小越先出队。如果 priority 相同,则按插入顺序(先进先出)。
  • task_done() :告诉队列一个任务已完成,配合 queue.join() 可以等待所有任务完成。
  • 阻塞行为 :如果队列为空,get() 会阻塞直到有元素;put() 默认不会阻塞(可设置 block=True, timeout

手动实现线程安全优先级队列:

  • heapq 模块 :提供堆队列算法,heappushheappop 保证最小的 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),每个队列用独立的工作线程池,确保关键任务资源隔离。

相关推荐
knight_9___8 小时前
LLM工具调用面试篇2
人工智能·python·深度学习·机器学习·agent·rag
阿瑞说项目管理9 小时前
有监督 vs 全自主:两种 Agent 范式,你选对了吗?
人工智能·agent·智能体·企业级ai
libokaifa9 小时前
Claude Code 的工程化落地:省 Token 篇
llm·agent·ai编程
Flynt11 小时前
用AI自动生成科研工作流:原理、架构与局限性
agent·工作流引擎
李昊哲小课11 小时前
自建API服务 天气查询 Agent 进阶教程
人工智能·agent·智能体·langgrah
knight_9___11 小时前
LLM工具调用面试篇1
开发语言·人工智能·python·面试·agent
Claw开发者11 小时前
Hermes 接 LiteLLM 缓存不生效踩坑记录
人工智能·agent
吾鳴13 小时前
手把手教你驯服“龙虾爱马仕”:Hermes Agent入门,这一篇就够了
agent
维元码簿13 小时前
Claude Code 深度拆解:工具系统——运行时流水线与并发调度
ai·agent·claude code·ai coding