1

サーバー上で長時間実行することを目的としたチェリーピーAPIがあります。

私の手に負えないさまざまな理由で、接続が停止したり閉じたりする可能性のある信頼できないクライアントがあります。

サーバー API の実行中は、接続のステータスを定期的にチェックし、クライアントがまだリッスンしていることを確認し、クライアントが離れている場合は操作を中止したいと考えています。

チェリーピー リクエストの処理中に接続ステータスをポーリングする方法を説明している適切な場所が見つかりませんでした。

このような長時間実行の一例は、小さなバッファー (限られたメモリ) のチャンクで複数の大きなファイル (数十 GB) の md5 を計算することです。

ここでの私の目標ではないため、ランタイムを短縮するソリューションは必要ありません。この接続をできる限り開いたままにしたいのですが、閉じている場合は中止します。

これが私のコードの簡単なサンプルです:

@cherrypy.expose
def foo(self):
    cherrypy.response.headers['Content-Type'] = 'text/plain'
    def run():
        for result in get_results(): # get_results() is a heavy method mentioned
            yield json.dumps(result)
    return run()
foo._cp_config = {'response.stream': True}
4

2 に答える 2

2

クライアントが停止したことを知る唯一の信頼できる方法は、ソケットにデータを書き込もうとすることです。CherryPy の場合は、yield. 空でない文字列を生成する必要があるため<head>、HTML ドキュメントの開始タグの後の余分なスペースなど、一部のフィラー テキストを処理できる Content-Type を返す必要があります。クライアントが接続を閉じると、CherryPy サーバーはハンドラーから生成された追加のデータの要求を停止します (closeクリーンアップできるようにジェネレーターで任意のメソッドを呼び出します)。

于 2013-01-23T15:51:56.583 に答える
0

私の知る限り、CherryPy はクライアントが停止したことを検出するメカニズムを提供していません。応答が完了するまでに時間がかかりすぎた (したがって、送信される) 場合にのみ通知されます。

詳細については、この SO スレッドを参照してください。

于 2013-01-23T13:06:04.817 に答える