Как установить асинхронное соединение с сервером couchbase из приложения Flask (Quart)?

Я пытаюсь преобразовать приложение Flask в приложение Quart, чтобы добавить асинхронный модуль и повысить производительность, как описано в этой статье. Для этого я подключаюсь к корзине Couchbase с помощью объекта acouchbase.Bucket. Проблема в том, что кварта работает медленнее и вылетает во время нагрузочного теста. Вот код, который я пытаюсь:

import asyncio
from quart import Quart, jsonify, g
from quart_openapi import Pint, Resource
import couchbase.experimental
couchbase.experimental.enable()
from acouchbase.bucket import Bucket

app = Pint(__name__, title = 'SomeTitle')

async def get_db():
    """
    Helper function to initialize and retrive the Bucket object if not 
    already present.
    """
    if not hasattr(g, 'cb_bucket'):
        g.cb_bucket = Bucket('couchbase://localhost/bucketname', 'username', 'password')
        await g.cb_bucket.connect()
    return g.cb_bucket

@app.route("/apiname/<string:xId>")
class apiname(Resource):
    async def get(self, xId):  
        cb = await get_db()
        pickle_in = open('mlmodel', 'rb')
        model = pickle.load(pickle_in)
        y_pred_proba = model.predict_proba(Member).tolist()
    return jsonify(y_pred_proba)

if __name__ == '__main__':  
app.run(port = 5000, debug = True)

Приложение компилируется без проблем, хотя во время нагрузочного теста оно работает плохо и через некоторое время вылетает. Очень похожее приложение для фляги (без какого-либо асинхронного модуля) работает быстрее, чем приложение для кварта, но можно ожидать, что кварта с асинхронным модулем будет быстрее, чем приложение для фляги:

Эквивалентная колба выглядит следующим образом:

from flask import Flask, jsonify  
from flask_restplus import Api, Resource
from couchbase.cluster import Cluster
from couchbase.cluster import PasswordAuthenticator
# Coucbase connections
cluster = Cluster('couchbase://localhost/')
authenticator = PasswordAuthenticator('username', 'password')
cluster.authenticate(authenticator)
cb = cluster.open_bucket('bucketname')

app = Flask(__name__) 
api = Api(app=app)

@api.route("/apiname/<string:xId>")
class apiname(Resource):
    def get(self, xId):
        Member = cb.get(xId)
        pickle_in = open('mlmodel', 'rb')
        model = pickle.load(pickle_in)
        y_pred_proba = model.predict_proba(Member).tolist()
    return jsonify(y_pred_proba)


if __name__ == '__main__':  
    app.run(port = 5000, debug = True)

Вот сравнение приложения Quart с колбой. Flask выглядит в 10 раз быстрее, чем приложение Quart, которое останавливается после теста с этой ошибкой _ 96930 Ошибка сегментации_.

Quart: Настой:

Любой ответ / рекомендация приветствуется.

1 ответ

Я думаю, что вы смешиваете Bucket с Cluster.

Из документации CouchBase:

Чтобы подключиться к корзине Couchbase, вы должны использовать управление доступом на основе ролей Couchbase (RBAC). Это полностью описано в разделе Авторизация. Аутентификатор, содержащий имя пользователя и пароль, должен быть определен, а затем передан в кластер. После успешной аутентификации ведро может быть открыто.

from couchbase.cluster import Cluster
from couchbase.cluster import PasswordAuthenticator
cluster = Cluster('couchbase://localhost')
authenticator = PasswordAuthenticator('username', 'password')
cluster.authenticate(authenticator)
bucket = cluster.open_bucket('bucket-name')

Итак, для вашего случая это должно быть что-то вроде:

if not hasattr(g, 'cb_bucket'):
  cluster = Cluster('couchbase://localhost')
  authenticator = PasswordAuthenticator('username', 'password')
  cluster.authenticate(authenticator)
  bucket = await cluster.open_bucket('bucket-name')
return bucket
Другие вопросы по тегам