Django 和 SQL 服务器,符合 gevent

Django and SQL Server, gevent compliant

我想在将来可以扩展的 Django 应用程序中使用 SQL 服务器数据库。

该应用程序将 I/O 绑定,所以我认为使其可扩展的最佳方法是将 Gunicorn 与 gevent worker class.

一起使用

问题是要将 Gunicorn 与 --worker-class gevent 一起使用,Django 应用程序应该符合 gevent,并且通常会发生某些数据库客户端不兼容的情况(例如:mysqlclient lib)。

我找到了这个 SQL Django 服务器后端:https://pypi.org/project/django-mssql-backend/ 但我无法理解它是否符合 gevent(又名“绿色”)。

我知道如果它只使用标准的 socket/networking python 库,可以很容易地进行猴子修补,但我不明白是否是这种情况。 pyodbc SQL 服务器后端 gevent 兼容吗?

官方手册和Google我找不到更多信息。

如果您愿意切换到 Postgresql,我已经设置了一个模块来完成您需要的一切:

这包括一个连接池来处理数千个并发连接。

** 更新 **

我有一个使用 Pymssql 的解决方案:

import gevent.socket
import pymssql
import traceback
import sys

def wait_callback(read_fileno):
    gevent.socket.wait_read(read_fileno)

pymssql.set_wait_callback(wait_callback)

def conn():
    return pymssql.connect(server=server, user=user, password=password, autocommit=True)

def fetchone(SQL, *args):
    with conn() as c:
        with c.cursor() as cursor:
            try:
                cursor.execute(SQL, args)
            except TypeError:
                cursor.execute(SQL, args[0])
            except Exception as exc:
                print(sys._getframe().f_back.f_code)
                print(sys._getframe().f_back.f_code.co_name)
                traceback.print_exc()
                return ()
            return cursor.fetchone()

def fetchall(SQL, *args):
    with conn() as c:
        with c.cursor() as cursor:
            try:
                cursor.execute(SQL, args)
            except TypeError:
                cursor.execute(SQL, args[0])
            except Exception as exc:
                print(sys._getframe().f_back.f_code)
                print(sys._getframe().f_back.f_code.co_name)
                traceback.print_exc()
                return ()
            return cursor.fetchall()

def execute(PSQL, *args):
    with conn() as c:
        with c.cursor() as cursor:
            try:
                cursor.execute(PSQL, args)
            except TypeError:
                cursor.execute(PSQL, args[0])
            except ValueError:
                cursor.execute(PSQL, tuple(args[0]))
            except:
                print(sys._getframe().f_back.f_code)
                print(sys._getframe().f_back.f_code.co_name)
                traceback.print_exc()
                return ()
            finally:
                return cursor.close()