Почему перемещение синхронного кода в loop.run_in_executor привело к снижению производительности при тестировании на Blazemeter - PullRequest
0 голосов
/ 28 мая 2019

Я использую

  • Python-3.7
  • sanic-19.3
  • asyncio-3.4
  • pandas-0.24

У меня есть несколько операций pandas в моем приложении, работающих на Sanic Framework.например:

pandas.merge(df1, df2, on='column_name', how='left')
df.sort_values(['column_name'], ascending=[False])
df.drop('column_name',1)
pandas.read_sql(query, pyodbc_connection)

Я пытался переместить их в run_in_executor, как предложено в документации asyncio.

loop = asyncio.get_event_loop()

await loop.run_in_executor(None,functools.partial(pandas.merge, left=df1, right=df2, on='column_name', how='left'))

await loop.run_in_executor(None, functools.partial(df.sort_values, by=['column_name'],ascending=[False]))

await loop.run_in_executor(None,pandas.read_sql,query,pyodbc_connection)

, но я видел общую производительность (измеряется в хитах / сек, в среднем. время отклика) уменьшается при тестировании на Blazemeter Протестировано с 50 одновременными виртуальными пользователями, 5 мин

Тестируемый API содержит много операций, включая и аналогичных тем, что упоминались выше (также включая вызовы БД)

  • ударов / с -> примерно на 12% уменьшилось
  • среднее время отклика -> примерно на 12-13% увеличилось
  • пропускная способность -> примерно на 12% уменьшилось

Перед добавлением loop.run_in_executor

После добавления loop.run_in_executor

следует отметить, что я звоню loop = asyncio.get_event_loop() в каждой функции, вместо того, чтобы вызывать ее в функции контроллера и передавать каждой вспомогательной функции, это объясняет снижение производительности?

Дайте мне знать, если требуется дополнительная информация. Спасибо

...