在ZSI肥皂中使用扭曲的adbapi

2024-04-28 00:00:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()

Tags: fromimportreturnserverresponserequestdeftwisted
1条回答
网友
1楼 · 发布于 2024-04-28 00:00:34

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

如果你从来没有得到任何回应,也许这不是你遇到过的问题。但在某个时刻,这将是一个问题。在

仔细观察,我想知道这个代码是否运行扭曲的反应堆。在第一次阅读时,我以为您在使用一些ZSI Twisted集成来运行服务器。现在我看到您正在使用wsgiref.simple_server。我有点自信这不会奏效。在

您已经在使用Twisted,use Twisted's WSGI server。在

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

相关问题 更多 >