首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ZSI soap中使用扭曲的adbapi

在ZSI soap中使用扭曲的adbapi
EN

Stack Overflow用户
提问于 2013-09-10 14:49:40
回答 1查看 284关注 0票数 0

我是python的新手,目前正在研究其用作soap服务器的可行性。我目前有一个使用mysql阻塞api的非常粗糙的应用程序,但我想尝试一下扭曲的adbapi。我已经成功地在使用reactors的常规扭曲代码上使用了twisted adbapi,但似乎无法使用ZSI框架在下面的代码中使用它。它不会从mysql返回任何内容。有没有人在ZSI中使用过扭曲的adbapi?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2013-09-10 20:59:06

您发布的代码为每个(某种)请求创建了一个新的ConnectionPool,并且它从不停止池。这意味着您最终将耗尽资源,并且您将无法为更多的请求提供服务。“最终”可能是在一个或两个或三个请求之后。

如果您从未得到任何响应,这可能不是您遇到的问题。不过,在某一时刻,这将是一个问题。

仔细检查一下,我想知道这段代码是否运行过Twisted反应器。第一眼看的时候,我以为你在使用ZSI Twisted集成来运行你的服务器。现在我看到您使用的是wsgiref.simple_server。我有一定的信心,这是行不通的。

您已经在使用Twisted,而不是use Twisted's WSGI server

除此之外,验证ZSI是否在正确的线程中执行回调。WSGI应用程序的缺省设置是在非reactor线程中运行。扭曲的API不是线程安全的,所以如果ZSI不采取一些措施来纠正这个问题,那么在线程中使用非线程安全的API就会引入错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18712318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档