gpt4 book ai didi

Python。 Tornado 。非阻塞 xmlrpc 客户端

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:09 27 4
gpt4 key购买 nike

基本上我们可以通过以下方式调用 xmlrpc 处理程序:

import xmlrpclib
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
print s.system.listmethods()

在tornado中我们可以这样整合:

import xmlrpclib
import tornado.web

s = xmlrpclib.ServerProxy('http://remote_host/rpc/')

class MyHandler(tornado.web.RequestHandler):
def get(self):
result = s.system.listmethods()

我有以下问题,有点新手,问题:

  1. result = s.system.listmethods() 会阻止 Tornado 吗?
  2. 周围有没有非阻塞的 xmlrpc 客户端?
  3. 我们如何实现result = yield gen.Task(s.system.listmethods)

最佳答案

1.是的,它会阻止 Tornado ,因为 xmlrpclib 使用阻塞 python 套接字(原样)

2.我不知道,但我会提供一个解决方案,您可以保留 xmlrpclib 但让它异步

3.我的解决方案没有使用tornado gen。

好的,所以每当您进行网络连接并需要编写异步代码时,请记住一个有用的库是 gevent,它是一个非常好的高质量库,我会推荐给所有人。

为什么它好用又好用?

  • 您可以以同步方式编写异步代码(这样就很容易)
  • 你所要做的就是使用一行简单的猴子补丁:

    从 gevent 导入猴子; monkey.patch_all()

使用 Tornado 时你需要知道两件事(你可能已经知道):

  • Tornado 仅在充当 HTTPServer 时支持异步 View (异步 View 不支持 WSGI)
  • 异步 View 需要通过使用 self.finish() 或 self.render()(调用 self.finish())自行终止响应

好的,下面是一个示例,说明您需要将 gevent 与 tornado 进行必要的集成:

# Python immports
import functools

# Tornado imports
import tornado.ioloop
import tornado.web
import tornado.httpserver

# XMLRpc imports
import xmlrpclib


# Asynchronous gevent decorator
def gasync(func):
@tornado.web.asynchronous
@functools.wraps(func)
def f(self, *args, **kwargs):
return gevent.spawn(func, self, *args, **kwargs)
return f


# Our XML RPC service
xml_service = xmlrpclib.ServerProxy('http://remote_host/rpc/')


class MyHandler(tornado.web.RequestHandler):
@gasync
def get(self):
# This doesn't block tornado thanks to gevent
# Which patches all of xmlrpclib's socket calls
# So they no longer are blocking
result = xml_service.system.listmethods()

# Do something here

# Write response to client
self.write('hello')
self.finish()


# Our URL Mappings
handlers = [
(r"/", MyHandler),
]


def main():
# Setup app and HTTP server
application = tornado.web.Application(handlers)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8000)

# Start ioloop
tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
main()

所以试试这个例子(显然根据您的需要进行调整),您应该可以开始了。

无需编写任何额外的代码,gevent 会完成修补 python 套接字的所有工作,因此它们可以异步使用,同时仍以同步方式编写代码(这是一个真正的好处)。

希望这有帮助:)

关于Python。 Tornado 。非阻塞 xmlrpc 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com