0

我在用着

  • Python-3.7
  • sanic-19.3
  • asyncio-3.4
  • 熊猫-0.24

我在 sanic 框架上运行的应用程序中几乎没有 pandas 操作。例如:

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)

我已尝试按照 asyncio 文档中的建议将它们移动到 run_in_executor 。

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 包含许多操作,包括和类似于上面提到的操作(也包括 DB 调用)

  • 命中/秒 -> 减少约 12%
  • 平均响应时间 -> 增加约 12-13%
  • 带宽 -> 减少约 12%

在添加 loop.run_in_executor 之前

添加 loop.run_in_executor 后

需要注意的一件事是我loop = asyncio.get_event_loop()在每个函数中调用,而不是在控制器函数中调用它并传递给每个辅助函数,这是否解释了性能损失?

让我知道是否需要更多信息 谢谢

4

0 回答 0