2012-06-21 38 views
1

我有一个由REST API提供的服务,Python库使用python-requests封装它。扭曲的服务器 - 客户端互连XML-RPC和REST服务

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

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

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

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

我宁可不使用多线程,我真的不想重写基于python的lib作为一个扭曲的客户端。有什么办法可以将请求整合到twisted的主循环中,或者其他合理的解决方案吗?

+2

“如何修改我的代码而不更改它?”这是一个艰难的。大多数修补程序至少涉及一些更改。 –

+0

没有人喜欢smartass ... –

+0

对不起,打扰你了。我会尽量在将来避开你的问题。 –

回答

1

如果你喜欢请求API的风格,但想要的东西,将与扭曲的工作,可以考虑使用treq。有support libraries写入接口可以是同步或异步取决于其调用者的需求。

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

但是,最终,让·保罗的评论是正确的;如果您想改变它的工作方式,您将需要对此代码的工作方式进行一些更改。

+0

这是几个月前,并在最后我用deferToThread你的建议。 –