关于flask后端处理数据库是否需要使用到进程池

最近在写一个论坛系统,其中很大一部分都在与数据库打交道。踩了不少坑,就在这里记录一下。

  1. 每次增删查改后都需要断开cursor的连接和数据库的连接,否则一旦连接数超过一定的数量,数据库就会报错
  2. 处理数据库的时候可以专门写一个function,把sql语句传进去就好
  3. 未必非要使用数据库的线程池

测试

为了让对比的结果更加直观,本次测试没有使用本地的mysql服务,而且连接到阿里云上海的服务器。(坐标泰国曼谷)
trace.png

对照测试1 使用进程池

这里使用的是 python 的 DBUtils

from DBUtils.PooledDB import PooledDB
import MySQLdb as mysql

# 创建一个线程池,
pool = PooledDB(mysql, 5,host='',user='',passwd='',db='',port=)

def select_sql():
   # 从线程池中取出一个线程
   conn = pool.connection()
   # 获取游标
   cursor = conn.cursor()
   try:
        cursor.execute("这里是sql语句")
        result = cursor.fetchone()
        print(result)
	#使用完成后关闭cursor和conn
        cursor.close()
        conn.close()
        return result
    except:
        print("执行错误: {}".format(sys.exc_info()))
        cursor.close()

test.png

经过测试,每个请求平均花费的时间是276ms

对照测试2 不使用进程池

import MySQLdb as mysql
def select_sql(sql):
    db = mysql.connect()
    cursor = db.cursor()
    print("准备执行查询sql指令: {}".format(sql))
    try:
        cursor.execute("这里是sql语句")
        result = cursor.fetchone()
        print(result)
        cursor.close()
        db.close()
        return result
    except:
        print("执行错误: {}".format(sys.exc_info()))
        cursor.close()
        db.close()

bdcecdb6947cc10ae09a032b3e2a03d.png
经过测试,每个请求的平均时间为73ms, 快了接近4倍

虽然不用线程池的响应速度相对快了,但是还没有测试过两种不同方式对服务器的压力。

最近偶然发现,flask压根就不需要使用gunicorn来启动多线程也不需要nginx或apache,甚至连app.run()里面都不需要加上threaded = True 或 processes = True 默认就已经开启了。而且经过测试发现,processes的速度比threaded更快,也许是因为服务器不同配置的原因。

题外话

最近很久都没有更新了,因为在准备把服务器迁移回国内。以及之前的xyz域名要过期了,才发现xyz的价格和com一样,所以果断选择了转向com域名。 备案号已经申请好了,可是公安网备案居然需要本人到网安大队才可以办,只能盼疫情早点结束,这样就可以早点回国

这学期的时间比上学期少的多,还得抽一些出来写我的论坛系统。一个人开发也太累了,哎

以及,再也不想捣鼓家里的树莓派了,除了能用上家里的百兆带宽,其他一无是处 还很麻烦。就让它安静的在那躺着当我的回国代理吧
虽然云服务器,特别的国内的云服务器,带宽给的是真的少,但用起来体验还是蛮不错的

评论