Python Flask并发demo(http并发与锁)独占接口、monkey功能还不太确定

文章目录

  • [Flask 并发接口实现示例](#Flask 并发接口实现示例)
    • 代码示例
    • 关键并发支持特性解析
      • [1. **Gevent monkey patching**:](#1. Gevent monkey patching:)
      • [2. **线程锁控制**:](#2. 线程锁控制:)
      • [3. **协程服务器**:](#3. 协程服务器:)
      • [4. **状态标志与异常处理**:](#4. 状态标志与异常处理:)
      • [5. **接口差异化处理**:](#5. 接口差异化处理:)
    • 使用场景
      • [- 需要处理高并发请求的 Web API 服务](#- 需要处理高并发请求的 Web API 服务)
      • [- 包含既有普通查询又有耗时操作的应用](#- 包含既有普通查询又有耗时操作的应用)
      • [- 资源有限但需要支持较大用户量的服务](#- 资源有限但需要支持较大用户量的服务)

Flask 并发接口实现示例

代码示例

flask接口默认不支持并发,加了spawn后由于某种原因还是不能并发,还需再加个monkey;如果有接口不适用于同时操作,可通过加锁来控制。

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Flask并发接口示例
演示如何创建支持高并发的Flask RESTful API服务
"""

# gevent monkey patch - 必须在最开始导入和使用
from gevent import monkey
monkey.patch_all()

import json
import threading
import time
from typing import Dict, Any

from flask import Flask, request, jsonify
from flask_cors import CORS
from gevent import pywsgi

# 创建Flask应用
app = Flask(__name__)

# 允许跨域请求
CORS(app)

# 创建线程锁,用于需要防止并发的操作
task_lock = threading.Lock()
# 任务状态标志
is_task_running = False

# 模拟数据库
db = {
    "items": [
        {"id": 1, "name": "项目1"},
        {"id": 2, "name": "项目2"},
        {"id": 3, "name": "项目3"}
    ]
}

@app.before_request
def log_request_info():
    """记录请求日志"""
    print(f"收到请求: {request.method} {request.path} - 来自 {request.remote_addr}")
    if request.method == 'POST' and request.is_json:
        print(f"请求数据: {request.get_json()}")

@app.route('/api/items', methods=['GET'])
def get_items():
    """获取所有项目 - 支持并发访问的接口"""
    try:
        print("获取所有项目...")
        # 这里可以有耗时的数据库查询
        return jsonify({
            'success': True,
            'items': db["items"]
        })
    except Exception as e:
        print(f"获取项目异常: {str(e)}")
        return jsonify({
            'success': False,
            'message': f"获取项目失败: {str(e)}"
        }), 500

@app.route('/api/items', methods=['POST'])
def add_item():
    """添加项目 - 普通并发接口"""
    try:
        data = request.get_json()
        if not data or 'name' not in data:
            return jsonify({
                'success': False,
                'message': '缺少必要参数: name'
            }), 400
        
        new_id = max([item["id"] for item in db["items"]]) + 1
        new_item = {"id": new_id, "name": data["name"]}
        db["items"].append(new_item)
        
        return jsonify({
            'success': True,
            'item': new_item
        })
    except Exception as e:
        print(f"添加项目异常: {str(e)}")
        return jsonify({
            'success': False,
            'message': f"添加失败: {str(e)}"
        }), 500

@app.route('/api/long-task', methods=['POST'])
def execute_long_task():
    """执行长时间任务 - 防止并发的接口示例"""
    global is_task_running
    
    try:
        # 尝试获取锁,非阻塞模式
        if not task_lock.acquire(blocking=False):
            print("另一个长时间任务正在执行中")
            return jsonify({
                'success': False,
                'message': '系统正在执行另一个任务,请稍后再试'
            }), 409  # 409 Conflict
        
        try:
            # 设置任务状态为执行中
            is_task_running = True
            print("开始执行长时间任务")
            
            # 模拟耗时操作
            time.sleep(5)
            
            result = {"task_result": "任务执行成功"}
            return jsonify({
                'success': True,
                'result': result
            })
        finally:
            # 无论成功与否,都释放锁并重置状态
            is_task_running = False
            task_lock.release()
            print("长时间任务执行完毕,释放锁")
            
    except Exception as e:
        # 确保任何异常情况下锁都被释放
        if is_task_running:
            is_task_running = False
            if task_lock.locked():
                task_lock.release()
                
        print(f"任务执行异常: {str(e)}")
        return jsonify({
            'success': False,
            'message': f"任务执行失败: {str(e)}"
        }), 500

@app.errorhandler(Exception)
def handle_exception(error):
    """全局异常处理"""
    print(f"应用异常: {str(error)}")
    return jsonify({
        'success': False,
        'message': str(error)
    }), 500

def run_app():
    """启动支持并发的应用"""
    try:
        port = 5000
        print(f"启动服务,监听端口: {port}")
        # 配置pywsgi服务器支持并发
        server = pywsgi.WSGIServer(('0.0.0.0', port), app, spawn=100)
        print("服务已配置为支持并发请求,最大并发数: 100")
        server.serve_forever()
    except Exception as e:
        print(f"服务启动失败: {str(e)}")
        raise

if __name__ == '__main__':
    run_app()

关键并发支持特性解析

这个示例实现了以下支持并发的关键特性:

1. Gevent monkey patching

  • 通过在所有其他导入之前应用 monkey.patch_all(),将系统标准库中的阻塞操作转换为协程友好的非阻塞实现

2. 线程锁控制

  • 对于需要防止并发访问的长时间任务,使用 threading.Lock 防止多个请求同时执行
  • 非阻塞锁获取 task_lock.acquire(blocking=False) 确保快速响应而不是让请求等待

3. 协程服务器

  • 使用 pywsgi.WSGIServer 取代默认的 Flask 开发服务器
  • 通过 spawn=100 参数配置,支持最多100个并发请求

4. 状态标志与异常处理

  • 使用 is_task_running 全局状态标志跟踪任务状态
  • 完善的异常处理确保无论任务是否成功完成,都会释放锁资源

5. 接口差异化处理

  • 普通查询类接口允许完全并发
  • 长时间任务类接口使用锁控制并发

这个设计允许 Flask 应用在处理并发请求时保持高性能,同时为需要独占执行的操作提供了安全保障。

使用场景

此模式适用于:

- 需要处理高并发请求的 Web API 服务

- 包含既有普通查询又有耗时操作的应用

- 资源有限但需要支持较大用户量的服务

ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍

ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ

相关推荐
CaracalTiger1 小时前
HTTP 协议的基本概念(请求/响应流程、状态码、Header、方法)问题解决方案大全
开发语言·网络·python·深度学习·网络协议·http·pip
西猫雷婶1 小时前
python学智能算法(十三)|机器学习朴素贝叶斯方法进阶-简单二元分类
开发语言·人工智能·python·深度学习·机器学习·矩阵·分类
张朝阳的博客2 小时前
哈夫曼树Python实现
开发语言·python
2501_916007473 小时前
Fiddler抓包工具实战指南:结合Charles、Postman优化Web与移动调试流程
websocket·网络协议·tcp/ip·http·网络安全·https·udp
里探3 小时前
FastAPI的初步学习(Django用户过来的)
python·django·fastapi
程序员一诺python4 小时前
【Django开发】django美多商城项目完整开发4.0第2篇:项目准备,配置【附代码文档】
后端·python·django·框架
面朝大海,春不暖,花不开4 小时前
Java服务提供者模式实现指南
java·开发语言·python
mit6.8244 小时前
[Data Pipeline] MinIO存储(数据湖) | 数据层 Bronze/Silver/Gold
数据库·python
宇宙超级勇猛无敌暴龙战神4 小时前
服务器如何从http升级到https(nginx)
服务器·http·https
love530love4 小时前
Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系
运维·ide·人工智能·windows·python·架构·pycharm