Я использую
- 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()
в каждой функции, вместо того, чтобы вызывать ее в функции контроллера и передавать каждой вспомогательной функции, это объясняет снижение производительности?
Дайте мне знать, если требуется дополнительная информация. Спасибо