Python。龙卷风。非阻塞 xmlrpc 客户端

2024-02-18

基本上我们可以通过以下方式调用 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. Will result = s.system.listmethods()阻止龙卷风?
  2. 是否有非阻塞 xmlrpc 客户端?
  3. 我们怎样才能实现result = yield gen.Task(s.system.listmethods)?

1.是的,它会阻止龙卷风,因为 xmlrpclib 使用阻止 python 套接字(事实上)

2.据我所知,但我将提供一个解决方案,您可以保留 xmlrpclib 但使其异步

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

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

为什么它好用又好用?

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

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

使用龙卷风时,您需要知道两件事(您可能已经知道):

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

好的,这里有一个示例,说明了与tornado 进行必要的 gevent 集成所需的内容:

# 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 套接字的所有工作,以便可以异步使用它们,同时仍然以同步方式编写代码(这是一个真正的好处)。

希望这可以帮助 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python。龙卷风。非阻塞 xmlrpc 客户端 的相关文章

随机推荐

  • 页面上的 WPF KeyDown 事件

    我有一个NavigationWindow with Page 页面 XAML
  • 如何制作符号表

    我们的任务是制作一个编译器 我们已经进行了词法和语法分析 但我们仍停留在中间代码的生成上 我们意识到我们必须实现一个符号表才能进行中间代码生成 但我们不知道如何做到这一点以及它包含什么 给出下面的代码 符号表应该包含什么 该代码是用教育语言
  • 选择器 - 在 jQuery 中选择页面上的所有表格

    假设我在嵌入式 div 的各个级别的页面上有多个表 没有 ID 或名称 我的选择器会是什么 如果可能的话 来选择所有表 无论它位于页面上的哪个位置 并根据第一行中第一个单元格的内容迭代或过滤表 你可以简单地使用 table 作为你的选择器
  • SQL Server:Oracle 中的 RowVersion 等效项

    Oracle 有类似的数据类型吗SQL服务器RowVersion http technet microsoft com en us library ms182776 aspx 当您插入或更新一行时 相应的版本列 其类型为RowVersion
  • int gl_VertexID 导致 Three.js 出错

    我一直在使用内置顶点索引的 gl VertexID 时遇到问题 通过使用in 与 Three js 一起使用 我不知道为什么 因为文档说它适用于所有版本的 OpenGL http www opengl org sdk docs mangls
  • Python - csr_matrix 的数据结构

    我正在研究TFIDF 我用过tfidf vectorizer fit transform 它返回一个 csr matrix 但我无法理解结果的结构 数据输入 文件 天空是蓝色的 太阳是明亮的 太阳在 天空很亮 我们可以看到灿烂的太阳 明亮的
  • 无法读取快速路由器中未定义的“get”属性

    我的代码如下所示 app js const app express const itemsRouter require routes items js app use bodyParser urlencoded extended true
  • JPA 1.0 错误:名称不是可识别的实体或标识符。已知实体名称:[]

    当我尝试执行简单的 JPA 1 0 代码时 出现以下异常 可能是什么原因 5453 DevPQRWDPBSSPersist WARN P 351601 O 0 CT openjpa Enhance This configuration di
  • 在 JavaScript 中将 Unix 时间戳转换为时间

    我将时间作为 Unix 时间戳存储在 MySQL 数据库中 并将其发送到一些 JavaScript 代码 我怎样才能从中抽出时间呢 例如 在HH MM SS format let unix timestamp 1549312452 Crea
  • 如何使用快捷方式在Android Studio中自动导入必要的类?

    我刚刚切换到 Android Studio 0 5 1 这里的事情进展得很慢 因为没有任何东西可以正常工作 如何使用快捷方式导入必要的类 我的意思是像这样的 import android os Bundle import android s
  • 有没有办法从 EF 中的字符串值数组动态生成多个点赞?

    我设置了一个搜索文本框 其中搜索将单独抓取每个单词并使用 包含 搜索字段 有没有办法通过 Contains 搜索字符串数组 Keep in mind that the array would be generated dynamically
  • 是否可以在 Travis 中启动 Selenium 服务器?

    我想在 Travis 中运行完整的 Selenium 测试 但我似乎无法启动服务器 我的 Travis YAML 文件 language node js node js 6 2 before script npm install selen
  • 改进 Scala 的 JVM [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何阻止netty在服务器套接字上监听和接受

    有没有办法告诉 netty 停止侦听和接受套接字上的新连接 但完成当前连接上任何正在进行的工作 你可以直接关闭ServerSocketChannel由创建的ChannelFactory 通常 ServerSocketChannel由返回Se
  • 自动填充到最后一个相邻单元格的宏

    我正在尝试使用 Excel 中的宏记录器来记录宏来填充一列单元格 但是因为每次填充的单元格数量不同 所以它要么填充得太短 要么填充得太长 这似乎是因为宏标识单元格范围及其固定 无论如何 我可以让它填充到最后一个填充的相邻单元格吗 例如 自动
  • 如何将安装(框架+应用程序)打包到一个可执行文件中?

    我想创建一个文件 setup exe 其中包含我用 C 开发的一个应用程序以及 Net Framework 4 0 的安装程序 这个想法是 当我执行 setup exe 时 它会检查计算机上是否安装了 net Framework 4 0 如
  • pd.merge() 和 dataframe.merge() 之间的区别

    我想知道当你合并时有什么区别pd merge versus dataframe merge 示例如下 pd merge dataframe1 dataframe2 and dataframe1 merge dataframe2 我们有两个函
  • 将纬度和经度值(度)转换为 Double 。爪哇

    我正在尝试将以度为单位的纬度和经度值转换为双倍 价值观是这样的 latitude 25 21 N longitude 55 23 E When i try to log this in android it is coming like t
  • 在log4net的appender中设置日志名称

    我有 MyLogger 类 我在其中使用 log4net 如何修改我的附加程序以将日志保存在特定的日志名中 我想通过参数 logName 设置它 public void AddEntry string source string logNa
  • Python。龙卷风。非阻塞 xmlrpc 客户端

    基本上我们可以通过以下方式调用 xmlrpc 处理程序 import xmlrpclib s xmlrpclib ServerProxy http remote host rpc print s system listmethods 在to