ユーザーがファイルをアップロードするWebアプリケーションで作業していますが、サーバー上のファイルの計算に時間がかかります。計算が完了すると、計算された結果が元のファイルとともに表示されます。セレンから大規模なjson応答がフラスコに届かない
これは小さいファイルでは機能しますが、大きなファイルでは失敗します。基本的に、jsonレスポンスが小さければ(サイズ3と11726のオブジェクトの配列がチェックされています)、ブラウザには出力されますが、応答が大きければ(サイズ507072)、出力されません。失敗したケースでアップロードされたファイルのサイズは約3 MBであり、jsonレスポンスにはアップロードされたファイルのすべてのデータが含まれているため、同じ順序であることを前提としています。セロリ側
Iが大きいJSONレスポンスに、
[2016-12-20 18:11:11,734: INFO/MainProcess] emitting event "response" to all [/test]
[2016-12-20 18:11:13,151: INFO/MainProcess] Task flask_application.restapi.background_thread[0457e7cb-f10b-408e-8f80-2bd95ce2c7b4] succeeded in 10.542778854s: None
同様小さいJSON応答(11726アレイのサイズ)の場合にはこれを見ています:
[2016-12-20 18:17:08,788: INFO/MainProcess] emitting event "response" to all [/test]
[2016-12-20 18:18:42,813: INFO/MainProcess] Task flask_application.restapi.background_thread[309e0ed6-94ec-4332-a2ed-b6d9211bc263] succeeded in 366.478926406s: None
フラスコ側
012小さなJSONレスポンスについては、私は最終的に(これは、それが切り捨てられたとして、フル出力ではありません)また、ブラウザ上に表示されている完全な放出された出力を、参照してください。
35,"Formula":"CHNO"},{"NA Corrected with zero":345,"Name":"XYZ","Label":"A","Sample":"M_6_6","Truth Value":false,"NA Corrected":323,"Formula":"CHNO"},{"NA Corrected with zero":422,"Name":"XYZ","Label":"A","Sample":"M_6_5","Truth Value":false,"NA Corrected":233,"Formula":"CHNO"},{"NA Corrected with zero":494,"Name":"XYZ","Label":"A","Sample":"M_6_4","Truth Value":false,"NA Corrected":4946,"Formula":"CHNO"},{"NA Corrected with zero":458,"Name":"L-Proline","Label":"A","Sample":"M_6_3","Truth Value":false,"NA Corrected":4586,"Formula":"CHNO"},{"NA Corrected with zero":493,"Name":"XYZ","Label":"A","Sample":"M_6_2","Truth Value":false,"NA Corrected":4935,"Formula":"CHNO"},{"NA Corrected with zero":4565,"Name":"XYZ","Label":"A","Sample":"M_6_1","Truth Value":false,"NA Corrected":45656,"Formula":"CHNO"}]}] [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:11PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
しかし、大規模な応答のために、そこにあります何もない。私はフラスコ、フラスコ-socketio、セロリ、Redisのを使用しています
20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44]
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69]
:フラスコはセロリから何かを受信していないようです。私はthis blogに続いてWebソケットと長いバックグラウンドタスクを実装しました。ここに関連コードがあります。
#socketio_redis
'SOCKETIO_REDIS_URL' = 'redis://localhost:6379/0'
@socketio.on('nacorr', namespace='/test')
def test_connect(data):
background_thread.delay(app.config['SOCKETIO_REDIS_URL'],data)
@celery.task
def background_thread(url, data):
local_socketio = SocketIO(message_queue=url)
local_socketio.emit('response', {'data': 'background task starting ...'}, namespace='/test')
# do something with data
responsejson = some_func_resulting_in_json_obj()
local_socketio.emit('response', responsejson, namespace='/test')
助けてください。すべてのタスクのキー値のRedis
更新
は同じ(のみ異なるタスクID)です:
127.0.0.1:6379> GET "celery-task-meta-691c61e6-ef2a-413c-9226-fac0be352928"
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"691c61e6-ef2a-413c-9226-fac0be352928\", \"children\": []}"
127.0.0.1:6379> GET "celery-task-meta-f01e0818-dc80-42e2-8ab0-2e4240f0e972"
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"f01e0818-dc80-42e2-8ab0-2e4240f0e972\", \"children\": []}"
127.0.0.1:6379> GET "celery-task-meta-5adc0627-3288-4d21-8bf7-6ee5964e1683"
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"5adc0627-3288-4d21-8bf7-6ee5964e1683\", \"children\": []}"
私はチャンクに私の応答を分割して発光することで、この問題を回避することができました小さなチャンクなので、おそらくどこかにバッファサイズの問題があります。
redisログには何か興味深いものはありますか? – Miguel
@Miguelあなたのコメントをありがとう!私はウェブソケットの新人です。あなたのブログポストと非常に多くの質問への回答のために、私はこの点まで到達することができました。 私はredisログで質問を更新しましたが、それは私にとってはうまくなりました。大きな応答を許さないバッファがありますか?私はこの大きな問題の小さなjsonチャンクを放出することでこの問題を回避することができたからです。 – Raaisa
私には限界があると思われますが、単純な検索では役に立たないものはありません。また、redisでsocketioチャンネルに接続して、そこに起こっていることを監視することもできます。これらの大きなペイロードがキューにまったく表示されるかどうかは興味深いでしょう。 – Miguel