Aiohttp: Komprimierung + Codierung sollte wahrscheinlich in Executor erfolgen

Erstellt am 18. Aug. 2018  ·  4Kommentare  ·  Quelle: aio-libs/aiohttp

Ich habe gerade ein Watchdog-Dienstprogramm für unsere Aiohttp-Server implementiert, das nachverfolgt, wann der Haupt-Thread länger als 5 Sekunden hängt, und den folgenden Callstack abfängt. Diese Antwort gab ein großes JSON-Objekt mit aktivierter Komprimierung zurück. Basierend auf dem Callstack denke ich, dass die Komprimierung wahrscheinlich in einem Hintergrund-Thread durchgeführt werden sollte, da sonst der Webserver für einige Sekunden blockiert werden kann und die Integritätsprüfungen fehlschlagen (beachten Sie, dass in AWS der Standardwert 5 Sekunden beträgt. Wenn also ein Vorgang länger als 5 Sekunden dauert) Server wird möglicherweise recycelt).


  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/fbn/fbn.com/api/weather/services/weatherapi/service.py", line 1430 in <module>
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/fbn/fbn.com/api/weather/services/weatherapi/service.py", line 1426 in start_app
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/fbn_async_server/entrypoint.py", line 237 in run_server
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/asyncio/base_events.py", line 422 in run_forever
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/asyncio/base_events.py", line 1434 in _run_once
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/asyncio/events.py", line 145 in _run
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/fbn_async_server/entrypoint.py", line 44 in start
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_protocol.py", line 398 in start
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 300 in prepare
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 605 in _start
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 329 in _start
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 290 in _start_compression
  | Aug 18 00:08:25.467 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 616 in _do_start_compression

wahrscheinlich run_in_executor ?

enhancement question server

Hilfreichster Kommentar

Danke für den Bericht.
Ich habe von Anfang an so etwas erwartet.

Das Umschalten der gesamten Komprimierung / Codierung auf den Thread-Pool kann einfache Fälle verlangsamen.
Optional können wir einen Executor für große Datenmengen verwenden und zum Dekomprimieren von beispielsweise 1 KB Puffer zurück zum direkten Aufruf wechseln.

Alle 4 Kommentare

Hier ist ein weiteres Problem:


  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/fbn/fbn.com/api/weather/services/weatherapi/service.py", line 734 in get_weather_for_locations
  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/fbn/fbn.com/api/weather/python/fbn/asyncio/aiohttp_utils.py", line 25 in json_response
  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/aiohttp/web_response.py", line 632 in json_response
  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/simplejson/__init__.py", line 399 in dumps
  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/simplejson/encoder.py", line 296 in encode
  | Aug 18 00:08:13.717 |   |   | WeatherAPIInternalService | File "/usr/local/lib/python3.6/site-packages/simplejson/encoder.py", line 378 in iterencode

Ein anderer Ort mit der Dumps-Methode kann in einem Executor ausgeführt werden oder eine asynchrone Methode unterstützen, damit der Aufrufer in Executor ausgeführt werden kann.

Danke für den Bericht.
Ich habe von Anfang an so etwas erwartet.

Das Umschalten der gesamten Komprimierung / Codierung auf den Thread-Pool kann einfache Fälle verlangsamen.
Optional können wir einen Executor für große Datenmengen verwenden und zum Dekomprimieren von beispielsweise 1 KB Puffer zurück zum direkten Aufruf wechseln.

Ich werde etwas codieren, werde PR einreichen, da dies für uns eine hohe Priorität hat

ok, probieren Sie es mal aus, lassen Sie mich wissen, was Sie denken

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen