我正在使用 Twisted 开发一个 Web 服务,该服务负责调用我以前在命令行上使用过的几个包。这些包处理的例程是自己制作的原型,但现在可以集成到我们的 Web 服务中。
简而言之,我有几个不同的模块,它们都以原始命令行形式在内部创建了一个 mysql 连接属性。以此为例:
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"])
getConnection 函数只是一个帮助器,分别返回一个 mongo 或 mysql 游标。同样,这都是原型:)
我遇到的问题是,当使用 Twisted 的 WSGI 资源作为持续运行的服务器实现时,init 中创建的 sql 连接超时,并且后续请求似乎没有重新生成它。小型服务器应用程序的示例代码:
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)
前几个请求工作正常,但在 mysqlswait_timeout
过期后,可怕的错误 2006 “Mysql has gone away” 错误浮出水面。我的理解是,对 WSGI Twisted 资源的每个请求都会运行应用程序功能,从而重新生成搜索器对象并重新租用连接。如果不是这种情况,我该如何处理请求?这种 Twisted 部署在这个意义上不是事务性的吗?谢谢!
编辑:根据请求,这里是调用连接的原型辅助函数:
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