我有一个由 REST API 提供的服务,并有一个使用 python 请求包装它的 Python 库。
我有一个由第三方(不是 Python)设计的“哑”用户界面,用于连接到本地 XML-RPC。
现在我必须连接两端并将 XML-RPC 调用转发到 REST API 并返回结果。它主要是异步的,不依赖于实时返回给用户的结果。大多数 XML-RPC 调用应该立即返回,将任务排队,而其他一些调用将稍后查询结果。数据在需要时存储在 sqlite 数据库中。
因此,我决定对这个中间层使用twisted.web.xmlrpc,并使用基于请求的库进行远程调用,它工作得很好。我想我偶尔会阻塞twisted的主循环几秒钟,但这不是什么大问题。
问题是我还必须从这个中间层将一些大文件上传到提供 REST API 的 HTTP 服务器。我无法使用基于请求的库进行这些上传,因为它将阻止扭曲循环,直到上传完成。
我宁愿不使用多线程,而且我真的不想重写我作为一个扭曲的客户端的基于 python 请求的库。有什么方法可以将请求集成到twisted的主循环中,或者任何其他合理的解决方案吗?
最佳答案
如果您喜欢 requests 的 API 风格,但想要一些可以与 Twisted 配合使用的东西,请考虑使用 treq 。有support libraries用于根据调用者的需要编写同步或异步接口(interface)。
如果您确实想使用请求,但又不想阻塞主循环,则可以使用 twisted.internet.threads.deferToThread
调用它。这基本上是透明的,如果您的请求不共享任何状态,您几乎可以忽略您正在使用多线程的事实。
但是,最终,让-保罗的评论是正确的;如果您想更改此代码的工作方式,则需要对其工作方式进行一些更改。
关于python - Twisted 服务器-客户端互连 XML-RPC 和 REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129978/