将Locust作为Python库使用时如何输出CSV统计文件?
解决Locust作为库使用时CSV统计文件的最终写入问题
我明白你现在的处境——已经成功初始化了StatsCSVFileWriter实例,但不确定怎么在测试结束时触发它完成最终的CSV文件写入。其实你只需要在测试流程的最后加上一个关键调用即可,咱们来一步步调整你的代码:
核心问题分析
StatsCSVFileWriter会在测试运行期间周期性写入统计数据,但测试结束时(runner退出后),还有一些最终的汇总数据需要写入,同时需要关闭文件句柄避免资源泄漏。这时候就需要手动调用它的close()方法来完成收尾工作。
修改后的完整代码
import os import time import gevent from locust import Environment, StatsCSVFileWriter from locust.stats import stats_printer, stats_history # 请替换为你的User类所在的模块导入 from your_user_module import User def start_locust(time_hh: int, time_mm: int, user: int, spawn_rate: int): # 初始化环境与运行器 env = Environment(user_classes=[User]) env.create_local_runner() # 配置CSV写入器 stats_path = os.path.join(os.getcwd(), "data") csv_writer = StatsCSVFileWriter( environment=env, base_filepath=stats_path, full_history=True, percentiles_to_report=[90.0, 95.0] ) # 显式绑定事件监听器,确保所有统计数据被捕获 env.events.request_success.add_listener(csv_writer.request_success) env.events.request_failure.add_listener(csv_writer.request_failure) env.events.report_to_master.add_listener(csv_writer.report_to_master) env.events.worker_report.add_listener(csv_writer.worker_report) # 启动WebUI env.create_web_ui(host="127.0.0.1", port=8089, stats_csv_writer=csv_writer) # 启动实时统计打印协程 gevent.spawn(stats_printer(env.stats)) # 启动统计历史保存协程 gevent.spawn(stats_history, env.runner) # 开始测试 env.runner.start(user_count=user, spawn_rate=spawn_rate) # 设置测试停止定时器 time_in_seconds = (time_hh * 60 * 60) + (time_mm * 60) gevent.spawn_later(time_in_seconds, lambda: env.runner.quit()) # 等待测试协程完成 env.runner.greenlet.join() # 关键操作:测试结束后触发CSV写入器的最终写入与资源清理 csv_writer.close() # 关闭WebUI服务 env.web_ui.stop()
关键修改点说明
- 绑定事件监听器:虽然初始化时传入了
environment,但显式绑定请求成功/失败、主从节点报告等核心事件,能确保所有统计数据都被正确捕获并写入文件。 - 调用
csv_writer.close():在测试协程完成后调用这个方法,它会:- 将剩余未写入的统计数据追加到CSV文件
- 生成最终的汇总统计行
- 关闭打开的文件句柄,避免资源泄漏
这样调整后,测试结束时你就能得到完整的CSV统计文件,包含所有请求的历史数据和指定的百分位数统计结果。
内容的提问来源于stack exchange,提问作者Angi2412
相关产品推荐
相关产品推荐

