Я работаю над веб-приложением, в котором пользователь загружает файл, некоторые вычисления выполняются в файле на сервере, который занимает много времени. Как только расчет выполнен, приложение отображает вычисленные результаты с исходным файлом.большой ответ json, испускаемый сельдереем, не достигая колбы
Это работает для небольших файлов, но не для больших файлов. В принципе, если json-ответ мал (проверен на массив объектов размером 3 и 11726), он испускается в браузер, но не для большого ответа (размер 507072). Загруженный файл в неудавшемся случае имеет размер ~ 3 МБ, а ответ json содержит все данные загруженного файла, поэтому, если предположить, что он также имеет тот же порядок.
На стороне сельдерея
Я вижу это в случае малого ответ JSON (11726 размера массива)
[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:
[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
На флаконе
Для небольшого ответа 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]
Но для большого ответа, есть ничего. Кажется, что колба ничего не получает от сельдерея:
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]
Я использую флягу, флягу-socketio, сельдерей и Redis. Я выполнил this blog для реализации сетевых сокетов и длинной фоновой задачи. Вот соответствующий код.
#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')
Любая помощь приветствуется.
Update
Redis ключевых значений всех задач являются одинаковыми (только разные идентификаторы задач):
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 Большое спасибо за ваш комментарий! Я новичок в websockets, и я смог достичь этого момента из-за ваших блог-постов и ответов на многие вопросы. Я обновил вопрос с помощью журналов redis, но мне это показалось прекрасным. Есть ли какой-то буфер, который не позволяет получить большой ответ? Потому что я смог решить эту проблему, выпустив небольшие кусочки json этого большого ответа. – Raaisa
Я подозреваю, что есть предел, но простой поиск не принес ничего полезного. Вы также можете подключиться к сокетному каналу на redis, чтобы следить за тем, что там происходит. Было бы интересно посмотреть, отображаются ли эти большие полезные нагрузки в очереди. – Miguel