如题, 我在使用 Locust 测试一个 UDP 服务器, 我发现当 Locust 中的负载用户执行的任务集中出现一些报错 (例如: 超时, 接收信息错误等) 时, 负载用户不会停止, 它会直接停止执行当前任务集, 然后再次获取测试数据, 重新执行与它绑定的任务集. 在这个过程中它不会执行任务集中我希望任务集执行异常或者退出时执行的 on_stop() 方法.
因此, 我抓取了 Locust 任务集中的报错, 并在异常处理中调用了 user.stop() 方法. 这样用户退出倒是会调用任务集中的 on_stop() 方法, 但是当我尝试使用, user.start() 方法重新启动一个用户时程序告诉我出现了一个 [Errno 9] Bad file descriptor 异常, 查询后我发现这是关闭了 socket 后再去调用 socket 中的方法导致的, 异常如下:

[2022-03-23 14:23:51,960] DESKTOP/ERROR/locust.user.task: [Errno 9] Bad file descriptor
  File "E:\project\Python\PerformanceTesting\locustUDPTester\clientSocket.py", line 66, in sendto
    super().sendto(send_data, self._address)
  File "e:\project\python\performancetesting\locustudptester\venv\lib\site-packages\gevent\_socketcommon.py", line 703, in sendto
    return self._sock.sendto(*args)
  File "e:\project\python\performancetesting\locustudptester\venv\lib\site-packages\gevent\_socket3.py", line 55, in _dummy
    raise OSError(EBADF, 'Bad file descriptor')
OSError: [Errno 9] Bad file descriptor

应该是调用, user.stop() 方法时会关闭与当前负载用户绑定的 socket, 那有什么方法可以在用户出现异常关闭时调用 on_stop() 方法, 又可以重新启动一个用户呢?


↙↙↙阅读原文可查看相关链接,并与作者交流