0

我是 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()
4

1 回答 1

1

ConnectionPool您发布的代码会为每个(某种)请求创建一个新的,并且它永远不会停止池。这意味着您最终将耗尽资源,并且您将无法再处理任何请求。“最终”可能是在一两个或三个请求之后。

如果您从未收到任何回复,那么这可能不是您遇到的问题。不过在某些时候这将是一个问题。

仔细观察,我想知道这段代码是否甚至运行了 Twisted reactor。在第一次阅读时,我以为您正在使用一些 ZSI Twisted 集成来运行您的服务器。现在我看到你正在使用wsgiref.simple_server. 我有适度的信心,这不会奏效。

您已经在使用 Twisted,请改用 Twisted 的 WSGI 服务器

除此之外,验证 ZSI 是否在正确的线程中执行您的回调。WSGI 应用程序的默认设置是在非反应器线程中运行。Twisted API 不是线程安全的,因此如果 ZSI 不对此进行纠正,您将在线程中使用非线程安全的 API 引入错误。

于 2013-09-10T12:59:05.987 回答