gevent и flask заставляют redis w / r тратить больше времени - PullRequest
0 голосов
/ 09 марта 2020

сервер: Ubuntu 14.04 2core и 4G.

gunicorn -k gevent и flask.

gunicorn==20.0.4
Flask==1.1.1
gevent==1.4.0

служба, стоящая за flask, представляет собой некоторое чтение / запись redis, просто маленькие ключи и ценности. используйте библиотеку python: redis == 3.4.1.

. Производственная проблема заключается в том, что, когда все больше людей используют один и тот же API, стоимость или время ответа API становятся тяжелыми и они проводят больше времени в Операции Redis: от 10 мс до 100 мс или даже больше.

mport time
import functools
import redis
from flask import Flask, request, jsonify


app = Flask(__name__)

pool = redis.ConnectionPool(host='127.0.0.1', 
                    port='6379', 
                    db=6,
                    encoding='utf-8',
                    decode_responses=True)
r = redis.StrictRedis(
        connection_pool=pool
    )

def timer(func):
    @functools.wraps(func)
    def decorator(*args, **kwargs):
        s = time.time()
        data = request.json or request.form.to_dict()
        r = func(data, *args, **kwargs)
        end = time.time()
        print('spend: {}'.format(int(end * 1000 - s * 1000)))
        return r

    return decorator

def get_no():
    z = r.get('test2')
    print('room_no: {}'.format(z))
    if not z:
        create_no()
        return get_no()
    else:
        if player_num() > 100:
            create_no()
            return get_no()
        else:
            return z

def player_num():
    return r.incrby('room_num')

def create_no():
    if r.setnx('lock', 1):
        print('locked!')
        n = r.incrby('test2')
        r.delete('room_num')
        r.delete('lock')
        return n
    else:
        print('sleep!')
        time.sleep(0.05)


@app.route('/test', methods=['POST', 'GET'])
@timer
def test(data):
    # no = get_no()
    # print(no)
    z = r.incrby('incry_4')
    print(z)
    return jsonify(dict(code=200))

Плюс, я провожу некоторые тесты на локальной машине с помощью wrk tool. и обнаружил, что при использовании большего количества соединений ответ API тратит больше времени. Я хочу знать, почему при использовании -k gevent API тратит больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...