Bottle 和 Mysql 阻塞请求

Bottle and Mysql blocking request

我想弄清楚为什么我的简单代码会阻塞并发请求:

# -*- coding: utf-8 -*-
import MySQLdb
from bottle import route, run
from gevent import monkey
monkey.patch_all()


cnx = MySQLdb.connect(host='127.0.0.1', port=3306, db='db', user='user', passwd='pass', use_unicode=True, charset="utf8mb4")
cursor = cnx.cursor()


@route('/testlong', method='GET')
def test_long():
    cursor.execute('SELECT SLEEP(5);')
    return 'finished'


@route('/testfast', method='GET')
def test_fast():
    return 'finished'


if __name__ == '__main__':
    run(host='127.0.0.1', port=46677, debug=True, server='gevent')

如果我 运行 http://localhost:46677/testlong 和同时 http://localhost:46677/testfast 在不同的浏览器上,我的第二个请求必须等待第一个是完成(所以 5 秒)。

请问我做错了什么?感谢您的帮助。

MySQLdb 包只是 C 扩展之上的薄 Python 包装器,这意味着 gevent 不能猴子修补它。

您应该使用纯 Python MySQL 客户端(如 PyMySQL)或使用支持线程的不同框架(如 FastAPI/Starlette)。