Pyramidを使用したサーバー送信イベント-クライアントへの接続が失われたかどうかを検出する方法

QLands

SSEメッセージを送信するピラミッドアプリケーションがあります。基本的に次のように機能します。

def message_generator():
    for i in range(100):
        print("Sending message:" + str(i))
        yield "data: %s\n\n" % json.dumps({'message': str(i)})
        time.sleep(random.randint(1, 10))

@view_config(route_name='events')
def events(request):
    headers = [('Content-Type', 'text/event-stream'),
               ('Cache-Control', 'no-cache')]
    response = Response(headerlist=headers)
    response.app_iter = message_generator()
    return response

/ eventsを参照すると、イベントが表示されます。別のページに移動するとイベントが停止し、ブラウザを閉じるとイベントが停止します。

この問題は、たとえば、/ eventsにいて、コンピューターの電源を切った場合に発生しますサーバーはクライアントが失われたことを認識せず、message_generatorはvoidにメッセージを送信し続けます。

このページの内容:サーバー送信イベントの概要は次とおりです。

...サーバーはこれを検出し(クライアントが停止したとき)、クライアントがイベントをリッスンしなくなったため、それ以上のイベントの送信を停止する必要があります。サーバーがこれを行わない場合、サーバーは基本的にイベントをvoidに送信します。

Pyramidでこれを検出する方法はありますか?で試しました

request.add_finished_callback()

しかし、このコールバックはで呼び出されるようです

return response

サーバーを起動するためにgeventでGunicornを使用します。

どんなアイデアでも大歓迎です

マイケルメリケル

PEP 3333から:

ジェネレーターまたは他のカスタムイテレーターを返すアプリケーションは、サーバーによって早期に閉じられる可能性があるため、イテレーター全体が消費されると想定しないでください。

基本的に、WSGIサーバーは、クライアントが切断さclose()れたapp_iterときにメソッドを呼び出す必要があります(例のように、すべてのジェネレーターがこれを自動的にサポートします)。ただし、サーバーはそれを行う必要はなく、多くのWSGIサーバーはそうではないようです。たとえば、gunicorn(私は独自に検証していません)について言及しましたが、ウェイトレスも検証していません。その結果、ウェイトレスで[1]を開き、修正に取り組んでいます。WSGI環境でのストリーミング応答は、せいぜい不安定であり、通常はサーバーに依存します。たとえば、ウェイトレスではsend_bytes=0、応答データがバッファリングれないように設定する必要があります。

[1] https://github.com/Pylons/waitress/issues/236

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

クライアント側からSignalRで失われた接続を検出する

接続が確立された後、(接続のリストを使用して)サーバーからクライアントにコマンドを送信するにはどうすればよいですか?

HTTP接続がクライアントによってクローズされたかどうかを検出する方法桟橋

サーバー送信イベントを使用したAngularJS

Qtを使用したサーバー送信イベント(SSE)

中央サーバーへの接続が失われた場合でも、多くの角度のあるクライアントが相互に通信するにはどうすればよいですか?

サーバーがポートへの接続を開いたが、クライアントが何も送信しなかった場合はどうなりますか?(Javaサーバーソケット)

OpenVPNサーバーがインターネットを使用しているときにOpenVPNサーバーを別のVPNに接続すると、OpenVPNクライアントのインターネットが失われました

サーバーへの接続がランダムに切断されたかどうかを検出する方法

サーバー送信イベントはクライアントの切断を検出しますか?

これは私のクライアント側とサーバー側のコードです。クライアントコードを2回実行した後、「接続に失敗しました」というエラーが表示される理由がわかりません

2つのクライアント/接続が同じネットワーク上にあるかどうかを検出する方法(nodeJS / express / socket.io)

Servicestackサーバーがイベントを送信しました

クライアントがサーバーから切断した場合、接続を切断するにはどうすればよいですか?

Spring WebFlux、EventSource、RabbitMQを使用してサーバーが送信したイベント

WebTestClientを使用したサーバー送信イベント(SSE)のテスト

WebSocketの代わりにサーバー送信イベントを使用した双方向のクライアント/サーバー通信?

クライアントからサーバーへの1つの確立されたtcp接続が与えられた場合、サーバーが明示的にacceptを呼び出さずに2番目の接続が解決されますか?

nghttp2:サーバーから送信されたイベントを使用してEventSourceで使用する

2013:「ハンドシェイクでMySQLサーバーへの接続が失われました:最初の通信パケットを読み取っています、システムエラー:115」接続しようとすると

Reactでは、コンポーネントがクライアントまたはサーバーからレンダリングされているかどうかをどのように検出しますか?

Qtのサーバーから接続されたクライアントにメッセージを送信する方法

PythonクライアントElasticsearchとの接続が失われた場合でもストリーミングデータを回復するにはどうすればよいですか?

JavaRMIクライアントがドメイン名を使用してJavaRMIサーバーに接続するにはどうすればよいですか。

サーバーが接続を閉じ、クライアントが同時にいくつかのデータを送信するとどうなりますか?

grpcサーバーで閉じられたクライアント接続を検出する

解析サーバーでLiveQueryに接続されたクライアントを検出する

Nginxを介したNode.jsでのサーバー送信イベント接続タイムアウト

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    どのように関係なく、それがどのように「悪い」、すべてのSSL証明書でのHttpClientを使用しないように

  3. 3

    Modbus Python Schneider PM5300

  4. 4

    Ansibleで複数行のシェルスクリプトを実行する方法

  5. 5

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  6. 6

    System.Data.OracleClient.OracleException:ORA-06550:行1、列7:

  7. 7

    インデックス作成時のドキュメントの順序は、Elasticsearchの検索パフォーマンスを向上させますか?

  8. 8

    scala.xmlノードを正しく比較する方法は?

  9. 9

    NGX-ブートストラップ:ドロップダウンに選択したアイテムが表示されない

  10. 10

    Elasticsearch - あいまい検索は、提案を与えていません

  11. 11

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  12. 12

    Elasticsearchの場合、間隔を空けた単語を使用したワイルドカード検索

  13. 13

    Elasticsearchでサーバー操作を最適化:低いディスク透かしに対処する

  14. 14

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  15. 15

    変数値を含むElasticSearch検索結果

  16. 16

    グラフ(.PNG)ファイルをエクスポートするZabbix

  17. 17

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  18. 18

    Audacity:プロジェクトではなく、サウンドファイルのみを保存します

  19. 19

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  20. 20

    Excelは、メモ帳データの複数の列を1つの列として解釈します

  21. 21

    ブラウザがHTMLテンプレートを解釈しない

ホットタグ

アーカイブ