【问题标题】:Twisted server-client interconnecting XML-RPC and REST services扭曲的服务器-客户端互连 XML-RPC 和 REST 服务
【发布时间】:2012-06-21 00:21:11
【问题描述】:

我有一个由 REST API 提供的服务,其中一个 Python 库使用 python-requests 包装了它。

我有一个由第三方(不是 Python)设计的“哑”用户界面,用于连接到本地 XML-RPC。

现在我必须连接两端并将 XML-RPC 调用转发到 REST API 并返回结果。它主要是异步的,不依赖于实时返回给用户的结果。大多数 XML-RPC 调用都应该立即返回,将任务排队,而其他一些调用将在稍后查询结果。数据在需要时存储在 sqlite 数据库中。

所以,我决定为这个中间层使用twisted.web.xmlrpc,并使用基于请求的库进行远程调用,它工作正常。我想我偶尔会阻塞扭曲的主循环几秒钟,但这没什么大不了的。

问题是我还必须从这个中间层上传一些大文件到提供 REST API 的 HTTP 服务器。我无法使用基于请求的库进行这些上传,因为它会阻止扭曲循环,直到上传完成。

我宁愿不使用多线程,而且我真的不想重写我作为扭曲客户端所拥有的基于 python-requests 的库。有什么方法可以将请求集成到twisted的主循环中,或者任何其他合理的解决方案?

【问题讨论】:

  • "如何在不更改代码的情况下修复我的代码?"这是一个艰难的。大多数修复至少涉及一些更改。
  • 很抱歉打扰您了。以后我会尽量避开你的问题。

标签: python twisted xml-rpc python-requests


【解决方案1】:

如果您喜欢 requests 的 API 风格,但想要一些可以与 Twisted 一起使用的东西,请考虑使用 treq。有support libraries 用于编写接口,可以根据调用者的需要同步或异步。

如果你真的想使用请求,但又不想阻塞主循环,你可以用twisted.internet.threads.deferToThread 调用它。这大部分是透明的,如果您的请求不共享任何状态,您几乎可以忽略您正在使用多线程这一事实。

但是,归根结底,让-保罗的评论是正确的;如果你想改变它的工作方式,你将需要对这段代码的工作方式进行一些改变。

【讨论】:

  • 这是几个月前的事了,最后我按照你的建议使用了 deferToThread。
猜你喜欢
  • 2015-09-11
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2012-06-04
相关资源
最近更新 更多