1

REST API によって提供されるサービスがあり、Python ライブラリが python-requests を使用してそれをラップしています。

ローカル XML-RPC に接続するためにサード パーティ (Python ではない) によって設計された「ダム」ユーザー インターフェイスがあります。

次に、両端を接続し、XML-RPC 呼び出しを REST API に転送して、結果を返す必要があります。ほとんどが非同期であり、ユーザーにリアルタイムで返される結果には依存しません。XML-RPC 呼び出しのほとんどは、すぐに戻り、タスクをキューに入れ、他の呼び出しが後で結果を照会することになっています。データは、必要になるまで sqlite データベースに保存されます。

そこで、この中間層に twisted.web.xmlrpc を使用し、リモート呼び出しにリクエスト ベースの lib を使用することにしました。これは正常に動作します。たまにツイストのメインループを数秒間ブロックしていると思いますが、それは大したことではありません。

問題は、この中間層から REST API を提供する HTTP サーバーに大きなファイルをアップロードする必要があることです。アップロードが完了するまでねじれたループがブロックされるため、リクエストベースのライブラリを使用してこれらのアップロードを行うことはできません。

私はむしろマルチスレッドを使用したくありません。また、ねじれたクライアントとして持っている python-requests ベースのライブラリを書き直したくありません。リクエストをツイストのメインループ、またはその他の合理的な解決策に統合する方法はありますか?

4

1 に答える 1

2

リクエストのスタイルの API は気に入っているが、Twisted で動作するものが必要な場合は、treqの使用を検討してください。呼び出し元のニーズに応じて、同期または非同期のインターフェイスを作成するためのサポート ライブラリがあります。

本当にリクエストを使用したいが、メイン ループをブロックしたくない場合は、 で呼び出すことができますtwisted.internet.threads.deferToThread。これはほとんど透過的であり、リクエストが状態を共有しない場合、マルチスレッドを使用しているという事実をほとんど無視できます。

しかし、最終的には、Jean-Paul のコメントは正しいです。動作方法を変更したい場合は、このコードの動作方法を変更する必要があります。

于 2012-11-25T17:48:56.430 に答える