我正在使用 Python 3.5、 uWSGI 2.0.11和 SQLAlchemy 1.0.9开发 Pyramid 1.7 Web 应用程序。似乎在将 uWSGI 与多个 worker 一起使用时,我们应该使用 uWSGI postfork 函数来连接到 Cassandra 集群,以确保每个 fork 将使用与池的独立连接。我尝试了以下 Pyramid 实现(文件:my_app/__init__.py
#my_app/__init__.py
def main(global_config, **settings):
try:
from uwsgidecorators import postfork
except ImportError:
# We're not in a uWSGI context, no need to hook dbs connection
# to the postfork event.
connection.setup(
[settings['cassandra.host']],
settings['cassandra.keyspace'],
port=int(settings['cassandra.port'])
)
else:
@postfork
def init():
""" Initialize dbs connexions in the context.
Ensures that a new connexion is returned for every new request.
"""
if cql_cluster is not None:
cql_cluster.shutdown()
if cql_session is not None:
cql_session.shutdown()
connection.setup(
[settings['cassandra.host']],
settings['cassandra.keyspace'],
port=int(settings['cassandra.port'])
)
config = Configurator(settings=settings, root_factory=my_factory)
config.scan()
return config.make_wsgi_app()
但是在使用 uWSGI 在生产中运行应用程序时,我遇到了连接超时。如果您安装libev库,Cassandra 将默认检测该库并使用它。但我不知道是否需要在 uWSGI 中进行一些更改才能兼容(一定要禁用 Monkeypatching)。
这是使用uWSGI 分叉模式配置 Pyramid + Cassandra + uWSGI 的正确方法吗?还是我错过了什么?