В каких случаях не будет разницы между синхронным кодом и асинхронным?
У меня есть небольшой проект на tornado, полностью синхронный запрос к которому выполняется за 300-400 миллисекунд. Там есть и работа с базой данных, и обращения к сторонним API. Потратил некоторое время, переписал всё в асинхронном стиле: все запросы к сторонним API и сервисам, перешёл на асинхронный движок для базы данных и написал для него свою небольшую ORM тоже, некоторые части кода отрефакторил, добавил кеширование - но, по какой-то причине, время запроса осталось то же. То есть ровно те же 300-400 миллисекунд. То есть не уменьшилось совсем. Тестирую на локальном сервере с помощью Insomnia.
Так вот, в чём может быть моя ошибка? Что я мог упустить?
Сергей Горностаев, А почему тогда во время нагрузочного тестирования как синхронная, так и асинхронная версии одинаково забивают мне все ядра? Ведь если, как вы говорите, он пуллит только блокирующие запросы - такого быть не должно?
Второй вариант тестирования, при котором я поставил concurrency 25 и время 15 секунд. Я заменил RequestHandler.write() на RequestHandler.finish() в синхронном коде, и на await RequestHandler.finish() в асинхронном. Я не уверен, что этот вариант тестирования можно считать адекватным, ведь теперь у меня соединение закрывается, а процессор продолжает выполнять какие-то задания. То есть даже спустя минуту после завершения теста - запросы к сторонним API отправляются. Но я получил такие же цифры для синхронного кода и в 10 раз большие цифры для асинхронного.
Цифры хорошие, но asyncio и tornado почему-то кричат все 15 секунд:
Traceback (most recent call last):
File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
self._context.run(self._callback, *self._args)
File "/usr/lib/python3.7/asyncio/selector_events.py", line 501, in _sock_connect_cb
fut.set_result(None)
asyncio.base_futures.InvalidStateError: invalid state
ERROR:asyncio:Exception in callback BaseSelectorEventLoop._sock_connect_cb(<Future finished result=None>, <socket.socke...29.132', 443)>, ('87.240.129.132', 443))
handle: <Handle BaseSelectorEventLoop._sock_connect_cb(<Future finished result=None>, <socket.socke...29.132', 443)>, ('87.240.129.132', 443))>
Traceback (most recent call last):
File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
self._context.run(self._callback, *self._args)
File "/usr/lib/python3.7/asyncio/selector_events.py", line 501, in _sock_connect_cb
fut.set_result(None)
asyncio.base_futures.InvalidStateError: invalid state
Process Process-2:
Traceback (most recent call last):
File "/usr/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/usr/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "/home/yardalgedal/v4_async/modules/server.py", line 23, in run
start_tornado()
File "/home/yardalgedal/v4_async/modules/server.py", line 43, in start_tornado
tornado.ioloop.IOLoop.current().start()
File "/home/yardalgedal/v4_async/venv/lib/python3.7/site-packages/tornado/platform/asyncio.py", line 148, in start
self.asyncio_loop.run_forever()
File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
self._run_once()
File "/usr/lib/python3.7/asyncio/base_events.py", line 1695, in _run_once
if handle._cancelled:
AttributeError: 'str' object has no attribute '_cancelled'
child 5 (pid 2707) exited with status 1, restarting