You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何让Bottle API访问全局队列

嘿,这个需求其实挺常见的,实现起来也很顺畅!核心思路就是用Python自带的线程安全队列作为两个线程的共享桥梁,再让Bottle的POST路由直接访问这个全局队列就行。我给你一步步拆解实现方案:

1. 先创建全局的线程安全队列

首先得用queue.Queue,它本身就内置了线程安全的锁机制,不用我们自己手动加锁,能避免多线程读写冲突的问题。代码示例:

import queue
from bottle import Bottle, request
import threading
import time

# 全局队列,这是API线程和数据处理线程共享的核心对象
global_queue = queue.Queue()
2. 编写Bottle的POST接口,把请求数据推到队列

因为队列是全局变量,Bottle的路由函数可以直接访问它,不用额外传参。这里假设请求是JSON格式,你可以根据实际业务调整数据获取方式:

app = Bottle()

@app.post('/push-data')
def push_data():
    # 从POST请求中提取数据
    data = request.json
    if not data:
        return {"status": "error", "message": "No valid data provided"}, 400
    
    # 将数据推入全局队列
    global_queue.put(data)
    return {"status": "success", "message": "Data added to processing queue"}
3. 实现数据处理线程

这个线程会持续监听队列,一旦有数据就取出来处理。queue.get()默认是阻塞式的,所以队列空的时候线程会自动等待,不用我们写循环休眠:

def data_processor():
    while True:
        # 阻塞等待队列中的数据
        data = global_queue.get()
        try:
            # 这里替换成你的实际数据处理逻辑,比如存库、计算、调用其他服务等
            print(f"Processing received data: {data}")
            # 处理完成后标记任务完成(如果需要追踪队列任务状态的话,可选但推荐)
            global_queue.task_done()
        except Exception as e:
            print(f"Failed to process data: {str(e)}")
            # 可选:如果处理失败,可以把数据重新放回队列或者记录到错误日志
            # global_queue.put(data)
4. 启动两个线程

最后把API服务和数据处理线程都启动起来,注意把处理线程设为守护线程,这样主程序退出时它会自动终止:

if __name__ == "__main__":
    # 启动数据处理线程,设置daemon=True让它随主进程退出
    processor_thread = threading.Thread(target=data_processor, daemon=True)
    processor_thread.start()
    
    # 启动Bottle API,默认是单线程,高并发场景可以换成threaded服务器
    # app.run(host='0.0.0.0', port=8080, server='threaded')
    app.run(host='0.0.0.0', port=8080)

几个关键注意点:

  • 务必用queue.Queue而不是自己用列表实现队列,因为列表的append和pop不是线程安全的,多线程操作会出问题。
  • 如果需要优先级处理,可以换成queue.PriorityQueue,按优先级排序取数据。
  • Bottle默认服务器是单线程的,如果你的POST请求量较大,记得开启多线程模式(比如server='threaded'),或者用Gunicorn这类生产级WSGI服务器部署。
  • 如果不想让处理线程成为守护线程,那需要在主程序退出前添加优雅停止逻辑,比如设置一个全局的停止标志,让处理线程循环检查这个标志后退出。

内容的提问来源于stack exchange,提问作者adrock123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:11:28