You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Locust自定义消息示例中的'WorkerNodes无encode属性'错误

Locust分布式模式下send_message指定Worker节点报错:'WorkerNodes' object has no attribute 'encode'

问题描述

我正在做分布式负载生成,需要协调Worker节点间的数据传递,参考了Locust的跨节点通信示例实现逻辑,但运行Master节点时出现了如下错误:

[2025-01-29 11:50:24,427] f3d0cd3a1386/INFO/locust.runners: Sending spawn jobs of 1 users at 1.00 spawn rate to 1 ready workers
[2025-01-29 11:50:24,428] f3d0cd3a1386/INFO/locust.util.exception_handler: Exception found on retry 1: -- retry after 1s
[2025-01-29 11:50:24,428] f3d0cd3a1386/ERROR/locust.util.exception_handler: 'WorkerNodes' object has no attribute 'encode'
Traceback (most recent call last):
  File "/opt/venv/lib/python3.12/site-packages/locust/util/exception_handler.py", line 13, in wrapper
    return function(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.12/site-packages/locust/rpc/zmqrpc.py", line 34, in send_to_client
    self.socket.send_multipart([msg.node_id.encode(), msg.serialize()])
                                ^^^^^^^^^^^^^^^^^^
AttributeError: 'WorkerNodes' object has no attribute 'encode'
[2025-01-29 11:50:25,431] f3d0cd3a1386/INFO/locust.util.exception_handler: Exception found on retry 2: -- retry after 3s
[2025-01-29 11:50:25,432] f3d0cd3a1386/ERROR/locust.util.exception_handler: 'WorkerNodes' object has no attribute 'encode'
Traceback (most recent call last):
  File "/opt/venv/lib/python3.12/site-packages/locust/util/exception_handler.py", line 13, in wrapper
    return function(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.12/site-packages/locust/rpc/zmqrpc.py", line 34, in send_to_client
    self.socket.send_multipart([msg.node_id.encode(), msg.serialize()])
                                ^^^^^^^^^^^^^^^^^^
AttributeError: 'WorkerNodes' object has no attribute 'encode'
[2025-01-29 11:50:28,434] f3d0cd3a1386/INFO/locust.util.exception_handler: Exception found on retry 3: -- retry after 5s
[2025-01-29 11:50:28,435] f3d0cd3a1386/ERROR/locust.util.exception_handler: 'WorkerNodes' object has no attribute 'encode'
Traceback (most recent call last):
  File "/opt/venv/lib/python3.12/site-packages/locust/util/exception_handler.py", line 13, in wrapper
    return function(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.12/site-packages/locust/rpc/zmqrpc.py", line 34, in send_to_client
    self.socket.send_multipart([msg.node_id.encode(), msg.serialize()])
                                ^^^^^^^^^^^^^^^^^^
AttributeError: 'WorkerNodes' object has no attribute 'encode'
[2025-01-29 11:50:33,437] f3d0cd3a1386/INFO/locust.util.exception_handler: Retry failed after 3 times.
[2025-01-29 11:50:33,442] f3d0cd3a1386/ERROR/root: Uncaught exception in event handler: 
Traceback (most recent call last):
  File "/opt/venv/lib/python3.12/site-packages/locust/event.py", line 47, in fire
    handler(**kwargs)
  File "/mnt/locust/locustfile.py", line 65, in on_test_start
    environment.runner.send_message("test_users", data, worker)
  File "/opt/venv/lib/python3.12/site-packages/locust/runners.py", line 1185, in send_message
    self.server.send_to_client(Message(msg_type, data, client_id))
  File "/opt/venv/lib/python3.12/site-packages/locust/util/exception_handler.py", line 13, in wrapper
    return function(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.12/site-packages/locust/rpc/zmqrpc.py", line 34, in send_to_client
    self.socket.send_multipart([msg.node_id.encode(), msg.serialize()])
                                ^^^^^^^^^^^^^^^^^^
AttributeError: 'WorkerNodes' object has no attribute 'encode'

[2025-01-29 11:50:34,444] f3d0cd3a1386/INFO/locust.runners: Spawning is complete and report waittime is expired, but not all reports received from workers: {"WebsiteUser": 0} (0 total users)

排查后发现问题出在这行代码:

environment.runner.send_message("test_users", data, worker)

移除worker参数后错误消失,但我需要给不同Worker节点发送不同的数据,请问该如何修复?

解决方案

错误原因

send_message方法的第三个参数需要传入字符串类型的Worker节点ID,但你传入的是WorkerNodes对象,代码尝试调用该对象的encode()方法(用于将字符串转为字节流)时失败,因为只有字符串才有这个方法。

修复方式

方式1:传入Worker对象的id属性

如果你的worker变量是从事件参数中获取的Worker实例,直接提取它的id属性作为第三个参数即可:

# 正确写法:传入worker.id而非worker对象
environment.runner.send_message("test_users", data, worker.id)

方式2:遍历所有Worker节点发送对应数据

如果需要给每个Worker分配不同的数据,可以先获取所有Worker的ID,再循环发送:

def on_test_start(environment, **kwargs):
    # 自定义:按Worker ID分配对应的数据
    worker_data_map = {
        "worker-node-1": {"task_group": "group_a", "user_count": 15},
        "worker-node-2": {"task_group": "group_b", "user_count": 25}
    }
    
    # 遍历所有已连接的Worker节点
    for worker_id in environment.runner.clients.keys():
        # 取出当前Worker对应的数据,无匹配则用默认值
        target_data = worker_data_map.get(worker_id, {"task_group": "default"})
        # 发送消息到指定Worker
        environment.runner.send_message("test_users", target_data, worker_id)

验证

修改后重启Master和Worker节点,错误会消失,且每个Worker能收到对应的数据。

内容的提问来源于stack exchange,提问作者Yako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:10:54