複数のクライアントがサーバー送信イベント ストリームに接続しようとしています/stream
。これは 1 つのクライアントで機能しますが、それ以上のクライアントを接続しようとすると、新しいクライアントがデータを待機して無期限にブロックされます。さらにデータを送信すると、最初のクライアントにのみ送信され、他のクライアントには送信されません。
ここに私の問題を示す小さなスニペットがあります:
import flask
import time
app = flask.Flask(__name__)
def event_stream():
for i in xrange(9999):
yield "data: %d\n\n" % i
time.sleep(1)
@app.route("/stream", methods=[ "GET" ])
def stream():
return flask.Response(
event_stream(),
mimetype="text/event-stream"
)
次に、これを で実行しgunicorn --worker-class=gevent -w 4 -t 99999 app:app
ます。単一のクライアントに対しては機能しますが、発行時に他のクライアントはブロックされGET /stream
ます。
ブロックの原因は何ですか?どうすれば修正できますか?
もう少しデバッグしたところ、奇妙な結果が得られました。この手順を実行すると、次のようになります。
- クライアント 1 を起動します (クライアント 1 のみがデータを受信します)。
- クライアント 2 の起動 (クライアント 1 のみがデータを受信)
- クライアント 3 の起動 (クライアント 1 のみがデータを受信)
- クライアント 4 の起動 (クライアント 1 のみがデータを受信)
- クライアント 1 を再起動します (4 つのクライアントすべてが突然同時にデータの受信を開始します)。