我是python的新手,目前正在研究它作为肥皂服务器使用的可行性。我目前有一个非常粗糙的应用程序,使用mysql阻止api,但想尝试扭曲的adbapi。我已经使用反应器在常规扭曲代码上成功使用了扭曲的adbapi,但似乎无法使用ZSI框架使用下面的代码。它没有从mysql返回任何东西。有人曾经和ZSI一起使用过扭曲的adbapi吗?
import os
import sys
from dpac_server import *
from ZSI.twisted.wsgi import (SOAPApplication,
soapmethod,
SOAPHandlerChainFactory)
from twisted.enterprise import adbapi
import MySQLdb
def _soapmethod(op):
op_request = GED("http://www.example.org/dpac/", op).pyclass
op_response = GED("http://www.example.org/dpac/", op + "Response").pyclass
return soapmethod(op_request.typecode, op_response.typecode,operation=op, soapaction=op)
class DPACServer(SOAPApplication):
factory = SOAPHandlerChainFactory
@_soapmethod('GetIPOperation')
def soap_GetIPOperation(self, request, response, **kw):
dbpool = adbapi.ConnectionPool("MySQLdb", '127.0.0.1','def_user', 'def_pwd', 'def_db', cp_reconnect=True)
def _dbSPGeneric(txn, cmts):
txn.execute("call def_db.getip(%s)", (cmts, ))
return txn.fetchall()
def dbSPGeneric(cmts):
return dbpool.runInteraction(_dbSPGeneric, cmts)
def returnResults(results):
response.Result = results
def showError(msg):
response.Error = msg
response.Result = ""
response.Error = ""
d = dbSPGeneric(request.Cmts)
d.addCallbacks(returnResults, showError)
return request, response
def main():
from wsgiref.simple_server import make_server
from ZSI.twisted.wsgi import WSGIApplication
application = WSGIApplication()
httpd = make_server('127.0.0.1', 8080, application)
application['dpac'] = DPACServer()
print "listening..."
httpd.serve_forever()
if __name__ == '__main__':
main()
答案 0 :(得分:1)
您发布的代码会为每个(某种)请求创建一个新的ConnectionPool
,它永远不会停止池。这意味着您最终将耗尽资源,您将无法再为更多请求提供服务。 “最终”可能是在一两个或三个请求之后。
如果你从未得到任何回复,也许这不是你遇到的问题。但是在某些时候它会出现 问题。
仔细观察,我想知道这个代码是否甚至可以运行Twisted反应堆。在第一次阅读时,我认为您正在使用一些ZSI Twisted集成来运行您的服务器。现在我看到你正在使用wsgiref.simple_server
。我有点确信这不起作用。
您已使用Twisted,use Twisted's WSGI server代替。
除此之外,验证ZSI是否在正确的线程中执行回调。 WSGI应用程序的默认值是在非反应器线程中运行。扭曲的API不是线程安全的,所以如果ZSI没有做些什么来纠正这个问题,你就会在线程中使用非线程安全的API引入错误。