1

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

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

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

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

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

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

4

1 回答 1

2

如果您喜欢 requests 的 API 风格,但想要一些可以与 Twisted 一起使用的东西,请考虑使用treq。有用于编写接口的支持库,这些接口可以是同步的或异步的,具体取决于调用者的需要。

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

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

于 2012-11-25T17:48:56.430 回答