Python gevent和posgres:异步连接失败
我正在使用gevent在基于Django的web系统上处理API I/O 我已使用以下方法进行了修补:Python gevent和posgres:异步连接失败,python,django,postgresql,gevent,Python,Django,Postgresql,Gevent,我正在使用gevent在基于Django的web系统上处理API I/O 我已使用以下方法进行了修补: import gevent.monkey; gevent.monkey.patch_socket() 我已使用以下方法修补了psychopg: import psycogreen; psycogreen.gevent.patch_psycopg() 尽管如此,某些Django调用so Model.save()失败,并出现错误:“异步连接失败”。我是否需要执行其他操作以使postgres g
import gevent.monkey; gevent.monkey.patch_socket()
我已使用以下方法修补了psychopg:
import psycogreen; psycogreen.gevent.patch_psycopg()
尽管如此,某些Django调用so Model.save()失败,并出现错误:“异步连接失败”。我是否需要执行其他操作以使postgres greenlet在Django环境中安全?还有什么我遗漏的吗?关于这个问题有一个问题,不幸的是,它是用俄语写的。让我引用最后一部分:
所有连接都存储在中,即
例如。每次都是ORM
即将发出查询,它通过调用
连接['default']。接下来,ConnectionHandler.\uuuu getattr\uuuuu会检查中是否存在连接
,并创建一个新的
空的
使用后,应关闭所有打开的连接。有一个信号
,由
. Django关闭数据库连接
在最后一刻,当没有人能再使用它的时候,它
看起来很合理
然而,ConnectionHandler如何存储数据库还有一个棘手的部分
连接。它使用
经过修补。声明一次,这个
这座建筑在每一个绿地上都是独一无二的。控制器
*某个视图*在一个greenlet中开始工作,现在我们在*ConnectionHandler.\u connections*中有了一个连接。然后我们创造一些
更多的绿色小菜,哪一个是空的
*ConnectionHandlers.\u connections*,他们从池中获取了connectinos。新的greenlet完成后,其local()的内容就消失了,
数据库连接没有返回到池中就随同它们一起消失了。在
过了一会儿,游泳池就空了
开发Django+gevent时,您应该始终牢记这一点并密切关注
通过调用数据库连接。信息技术
也应该在异常时调用,您可以为
比如说:
class autoclose(object):
def __init__(self, f=None):
self.f = f
def __call__(self, *args, **kwargs):
with self:
return self.f(*args, **kwargs)
def __enter__(self):
pass
def __exit__(self, exc_type, exc_info, tb):
from django.db import close_connection
close_connection()
return exc_type is None