【问题标题】:Python library for a SOAP server that handles multiple requests simultaneously?用于同时处理多个请求的 SOAP 服务器的 Python 库?
【发布时间】:2012-02-16 09:29:41
【问题描述】:

我正在寻找一个 python 库,用于轻松创建公开 Web 服务 (SOAP) 并可以同时处理多个请求的服务器。

我尝试过使用 ZSI 和 rcplib,但没有成功。

更新:
感谢您的回答。 ZSI 和 rcplib(soaplib 的继承者)都实现了自己的 Http 服务器。如何将 ZSI/rcplib 与您提到的库集成?

更新 2:
经过一些调整,我设法在 linux 上安装并运行它,它似乎运行良好。
然后我在 Windows 上安装了它,经过很多丑陋的调整,然后我偶然发现 Windows 不支持 WSGIDaemonProcess 的事实(在 mod_wsgi 文档中也提到过)。无论如何我都尝试运行它,它似乎可以异步处理每个请求,但我不确定它是否能在压力下正常工作。

还是谢谢...

【问题讨论】:

    标签: python multithreading web-services soap


    【解决方案1】:

    rpclib 的 Hello World 示例

    请从 rpclib 示例中检查此内容

    # File /home/myhome/test.wsgi
    import logging
    
    from rpclib.application import Application
    from rpclib.decorator import srpc
    from rpclib.interface.wsdl import Wsdl11
    from rpclib.protocol.soap import Soap11
    from rpclib.service import ServiceBase
    from rpclib.model.complex import Iterable
    from rpclib.model.primitive import Integer
    from rpclib.model.primitive import String
    from rpclib.server.wsgi import WsgiApplication
    
    class HelloWorldService(ServiceBase):
        @srpc(String, Integer, _returns=Iterable(String))
        def say_hello(name, times):
            '''
            Docstrings for service methods appear as documentation in the wsdl
            <b>what fun</b>
            @param name the name to say hello to
            @param the number of times to say hello
            @return the completed array
            '''
    
            for i in xrange(times):
                yield 'Hello, %s' % name
    
    application = WsgiApplication(Application([HelloWorldService], 'rpclib.examples.hello.soap',
                    interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11()))
    

    还将您的 apache 配置更改为

    WSGIDaemonProcess example processes=5 threads=5
    WSGIProcessGroup example
    
    WSGIScriptAlias / /home/myhome/test.wsgi
    <Directory /home/myhome/>
    Order deny,allow
    Allow from all
    </Directory>
    

    根据您的要求,您可以更改进程和线程。

    【讨论】:

      【解决方案2】:

      对不起,可能是我没听懂你的意思。

      我认为您希望您的服务器并行处理 HTTP 请求,但是您不需要考虑您的代码/库。并行化应该由 Apache httpd 和 mod_wsgi/mod_python 模块完成。

      例如,只需使用“MaxClients 100”和“WSGIDaemonProcess webservice processes=1 threads=100”设置 httpd.conf。

      【讨论】:

      • 我已经更新了我的问题。请同时更新您的答案:)
      • 像这样盲目地将线程设置为 100 是个坏主意。太多这样的线程实际上会影响性能。应该使用更少线程的更多进程。
      • @GrahamDumpleton 谢谢你,格雷厄姆。我为我的应用程序使用了 processes=1 threads=150,但随后尝试了 processes=5 threads=30 并且它在客户端>150 时效果更好
      • 除非您的请求很长,否则您实际上可以在比这更少的线程上为 150 个客户端提供服务。这是因为当请求很短时,它们不会与其他 149 个客户端重叠。因此它们可以相互交错并使用更少的线程。参见例如 plus.google.com/114657481176404420131/posts/G1jM6WW3Pnu 在这种情况下,我从内存中增加了 150 个客户端并用 9 个线程处理它。请注意我在那篇文章中所说的关于线程利用率的内容以及随着它们的增加如何开始看到排队时间增加。
      【解决方案3】:

      您可以使用soaplib 来开发您的肥皂服务。要将该服务公开给其他人,您可以使用 Apache 和 mod_wsgi 模块。要设置它是多线程或多处理,您可以在mod_wsgi中设置参数

      【讨论】:

      • 我已经更新了我的问题。请同时更新您的答案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多