Attualmente sto usando Flask-uWSGI-Websockets per fornire funzionalità websocket per la mia applicazione. Uso Flask-SQLAlchemy per connettermi al mio database MySQL.Flask-SQLAlchemy e Gevent che non chiudono le connessioni mysql
Flask-uWSGI-Websockets utilizza gevent per gestire le connessioni Websocket.
Il problema che sto avendo attualmente è che quando una connessione web-socket è terminata, la connessione al database impostata da Flask-SQLAlchemy continuerà a vivere.
Ho provato a chiamare db.session.close()
e db.engine.dispose()
dopo ogni connessione websocket, ma ciò non ha avuto alcun effetto.
Chiamare gevent.monkey.patch_all()
all'inizio della mia app non fa differenza.
Una semplice rappresentazione di quello che sto facendo è questo:
from gevent.monkey import patch_all
patch_all()
from flask import Flask
from flask_uwsgi_websocket import GeventWebSocket
from flask_sqlalchemy import SQLAlchemy
app = Flask()
ws = GeventWebSocket()
db = SQLAlchemy()
db.init_app(app)
ws.init_app(app)
@ws.route('/ws')
def websocket(client):
""" handle messages """
while client.connected is True:
msg = client.recv()
# do some db stuff with the message
# The following part is executed when the connection is broken,
# i tried this for removing the connection, but the actual
# connection will stay open (i can see this on the mysql server).
db.session.close()
db.engine.dispose()
Sei sicuro che si raggiunge il codice di chiusura della sessione? può essere che invece venga sollevata un'eccezione? In tal caso inserisco il codice di chiusura della sessione nel corpo di un'istruzione 'finally' – architectonic