Je travaille sur un service web avec Twisted qui est responsable de l'appel de plusieurs paquets que j'avais précédemment utilisés en ligne de commande. Les routines gérées par ces paquets étaient en cours de prototypage mais sont maintenant prêtes à être intégrées dans notre service web.
En bref, j'ai plusieurs modules différents qui créent tous une propriété de connexion mysql en interne dans leur forme originale de ligne de commande. Prenons l'exemple suivant :
class searcher:
def __init__(self,lat,lon,radius):
self.conn = getConnection()[1]
self.con=self.conn.cursor();
self.mgo = getConnection(True)
self.lat = lat
self.lon = lon
self.radius = radius
self.profsinrange()
self.cache = memcache.Client(["173.220.194.84:11211"])
La fonction getConnection est juste une aide qui renvoie un curseur mongo ou mysql respectivement. Encore une fois, tout ceci est prototypique :)
Le problème que je rencontre est que lorsqu'il est implémenté en tant que serveur fonctionnant en permanence en utilisant la ressource WSGI de Twisted, la connexion sql créée lors de l'initialisation est interrompue, et les requêtes suivantes ne semblent pas la régénérer. Exemple de code pour une petite application serveur :
from twisted.web import server
from twisted.web.wsgi import WSGIResource
from twisted.python.threadpool import ThreadPool
from twisted.internet import reactor
from twisted.application import service, strports
import cgi
import gnengine
import nn
wsgiThreadPool = ThreadPool()
wsgiThreadPool.start()
# ensuring that it will be stopped when the reactor shuts down
reactor.addSystemEventTrigger('after', 'shutdown', wsgiThreadPool.stop)
def application(environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
params = cgi.parse_qs(environ['QUERY_STRING'])
try:
lat = float(params['lat'][0])
lon = float(params['lon'][0])
radius = int(params['radius'][0])
query_terms = params['query']
s = gnengine.searcher(lat,lon,radius)
query_terms = ' '.join( query_terms )
json = s.query(query_terms)
return [json]
except Exception, e:
return [str(e),str(params)]
return ['error']
wsgiAppAsResource = WSGIResource(reactor, wsgiThreadPool, application)
# Hooks for twistd
application = service.Application('Twisted.web.wsgi Hello World Example')
server = strports.service('tcp:8080', server.Site(wsgiAppAsResource))
server.setServiceParent(application)
Les premières requêtes fonctionnent bien, mais après que mysqls wait_timeout
expire, la redoutable erreur 2006 "Mysql a disparu" fait surface. J'avais cru comprendre que chaque requête à la ressource WSGI Twisted exécuterait la fonction d'application, régénérant ainsi l'objet de recherche et libérant à nouveau la connexion. Si ce n'est pas le cas, comment puis-je faire en sorte que les requêtes soient traitées comme telles ? Ce type de déploiement Twisted n'est-il pas transactionnel dans ce sens ? Merci de votre compréhension.
EDIT : A la demande, voici le prototype de la fonction d'aide qui établit la connexion :
def getConnection(mong = False):
if mong == False:
connection = mysql.connect(host = db_host,
user = db_user,
passwd = db_pass,
db = db,
cursorclass=mysql.cursors.DictCursor)
cur = connection.cursor();
return (cur,connection)
else:
return pymongo.Connection('173.220.194.84',27017).gonation_test