2012-06-21 111 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你的建議。 –