私は、コマンドラインで以前に使用したいくつかのパッケージを呼び出す責任がある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)
最初のいくつかのリクエストは正常に機能しますが、mysqlwait_timeout
の有効期限が切れると、2006年の「Mysqlが消えました」という恐ろしいエラーエラーが表示されます。WSGI 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