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
相关产品推荐
相关产品推荐

