尝试使用一个服务调用部署在同一域中的另一个服务时超时

2024-06-09 22:42:25 发布

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

基于这个answer,我能够创建和部署2个web服务。但是,如果一个服务试图调用另一个服务,它会挂起直到超时。在

我的代码是:

from wsgiref.simple_server import make_server
from spyne.application import Application
from spyne.protocol.soap import Soap11
from spyne.util.wsgi_wrapper import WsgiMounter
from suds.client import Client
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Unicode

class Service_Caller(ServiceBase):
  @srpc(_returns=Unicode)
  def call_service():
    client = Client("http://localhost:8000/hello?wsdl")
    result = client.service.say_hello('world')
    return result

class HelloWorldService(ServiceBase):
  @srpc(Unicode, _returns=Unicode)
  def say_hello(name):
      return [u'Hello, %s' % name]

if __name__ == '__main__':
  app1 = Application([Service_Caller], 'example1',
        in_protocol=Soap11(), out_protocol=Soap11())
  app2 = Application([HelloWorldService], 'example2',
        in_protocol=Soap11(), out_protocol=Soap11())
  wsgi_app = WsgiMounter({"caller":app1, "hello":app2})
  server = make_server('0.0.0.0', 8000, wsgi_app)
  server.serve_forever()

使用以下方式调用服务:

^{pr2}$

目前,我的代码工作的唯一方法是在不同的域或不同的端口上部署2个服务。我想知道是否有人也有同样的问题,并知道任何解决办法。谢谢。在


Tags: namefromimportclientwsgihelloserverapplication
1条回答
网友
1楼 · 发布于 2024-06-09 22:42:25

这是因为您使用的WSGI实现(wsgiref)。wsgiref只是一个参考Wsgi实现,不支持并发。对于生产使用,您应该切换到一个合适的wsgi容器,比如mod泳wsgi、CherryPy、twisted等,以及neverusewsgiref。在

再说一次,我再怎么强调也不过分,从不将wsgiref用于生产用途。在

也就是说,如果你只想从另一个服务中调用一个服务,还有一个更好的方法:

from spyne.util.appreg import get_application

app = get_application('example2', 'Application').null
print app.service.say_hello('world')

下面是一个完全有效的例子:

^{pr2}$

我希望这有帮助。在

相关问题 更多 >