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)。
我想弄清楚为什么我的简单代码会阻塞并发请求:
# -*- 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)。