13

私はpython3 + falconの組み合わせを使ってAPIを書いています。

メソッドにはクライアントに返信できる場所がたくさんありますが、DB や I/O 操作などを行う重いコードがあるため、重い部分が終了するまで待たなければなりません。

例えば:

class APIHandler:                                                                      
  def on_get(self, req, resp):
    response = "Hello"
    #Some heavy code
    resp.body(response)

コードの最初の行で「Hello」を送信できました。私が望むのは、重いコードをバックグラウンドで実行し、重い部分がいつ終了するかに関係なく応答を送信することです。

Falconには組み込みの非同期機能はありませんが、geventなどで使用できると述べています。これら2つを組み合わせる方法に関するドキュメントは見つかりませんでした。

4

4 に答える 4

8

クライアント ライブラリは非同期操作に対してさまざまなサポートを提供するため、多くの場合、特定のバックエンド クライアントでどの非同期アプローチが最もサポートされているか、どの WSGI サーバーを使用するかを組み合わせて決定します。いくつかのより一般的なオプションについては、以下も参照してください...

ネイティブまたは何らかのサブクラス化メカニズムを介して非同期相互作用モデルをサポートしないライブラリの場合、タスクをスレッド プールに委任できます。また、特に長時間実行されるタスク (つまり、数秒または数分のオーダー) の場合、Celery は悪い選択ではありません。

WSGI (およびFalcon ) アプリのより一般的な非同期オプションのいくつかの簡単な調査:

  • ねじれた。明示的な非同期スタイルを好み、おそらく最も成熟したオプションです。Falcon のような WSGI フレームワークと統合するために、twisted.web.wsgicrochetがあります。
  • 非同期。Twisted から多くのアイデアを借りていますが、Python 3 言語機能を利用してよりクリーンなインターフェイスを提供します。長期的には、これはおそらく最もクリーンなオプションですが、WSGI インターフェイスの進化が必要になります (可能なアプローチの 1 つとして、PEP-3333 への pulsar の拡張も参照してください)。この記事の執筆時点では、asyncio エコシステムは比較的新しいものです。コミュニティは、インターフェイス、パターン、およびツールに関するさまざまなアプローチをまだ試しています。
  • イベントレット。非同期コードを同期的に見せることを目指す暗黙的なスタイルを好みます。eventlet がこれを行う 1 つの方法は、標準ライブラリの I/O モジュールにモンキー パッチを適用することです。このアプローチを好まない人もいます。これは、非同期メカニズムがマスクされ、エッジ ケースのデバッグが難しくなるためです。
  • イベント。もう少し現代的ではありますが、eventlet に似ています。uWSGI と Gunicorn はどちらも、標準ライブラリにモンキー パッチを適用する gevent ワーカー タイプをサポートしています。

最後に、Falcon を拡張して twisted.web または asyncio (ala aiohttp) をネイティブにサポートするようにすることは可能かもしれませんが、まだ試した人はいないと思います。

于 2015-06-11T20:37:39.847 に答える
5

非同期関連の作業には Celery を使用します。gevent については知りません。これを見てください http://celery.readthedocs.org/en/latest/getting-started/introduction.html

于 2015-02-10T09:03:26.823 に答える