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

Poisson采样场景下deque中Client对象arrival_time读取异常问题

队列中Client对象arrival_time属性异常的原因

在以下代码中,创建了包含name、arrival_time、arrival_time_delay属性的Client类,通过循环利用Poisson采样生成的延迟创建客户端并加入deque队列。添加客户端到队列时所有对象属性均不同,但读取队列时,除第一个对象外其余客户端的arrival_time值全部相同。

import random
import numpy as np
import collections

# 基于Poisson分布创建队列的客户端类,客户端将被加入deque
class Client:
    def __init__(self):
        self.name = random.choice(["Juan", "julia", "Daniel", "Rafael", "Lida", "Sandra"])
        self.arrival_time = 0
        self.arrival_time_delay = np.random.poisson(5, size=1)

    def __str__(self) -> str:
        return "Client: {} arrival-time: {} delay {}".format(self.name, self.arrival_time, self.arrival_time_delay)


client_count = 5
queue = collections.deque()

# 到达时间
time_added = 0
# 将客户端加入deque队列
for _ in range(client_count):
    client = Client()
    # 新客户端的到达时间为当前时间加上延迟
    client.arrival_time = time_added
    print(client)
    queue.append(client)
    time_added += client.arrival_time_delay

print(60 * "#")

for c in queue:
    print(c)

运行结果:

Client: julia arrival-time: 0 delay [6]
Client: Sandra arrival-time: [6] delay [3]
Client: Lida arrival-time: [9] delay [4]
Client: Juan arrival-time: [13] delay [8]
Client: Sandra arrival-time: [21] delay [6]
############################################################
Client: julia arrival-time: 0 delay [6]
Client: Sandra arrival-time: [27] delay [3]
Client: Lida arrival-time: [27] delay [4]
Client: Juan arrival-time: [27] delay [8]
Client: Sandra arrival-time: [27] delay [6]

异常原因

核心问题是numpy泊松采样的返回值类型错误:

  • np.random.poisson(5, size=1)返回的是长度为1的numpy数组(比如[6]),不是单个整数。
  • 初始time_added是整数0,第一个客户端的arrival_time被赋值为这个整数,整数是不可变类型,后续不会被修改。
  • 第一次执行time_added += client.arrival_time_delay后,time_added变成了numpy数组。之后每次循环里,client.arrival_time = time_added都是把这个数组的引用传给客户端的属性。
  • numpy数组是可变对象,后续每次time_added += ...都会直接修改数组里的数值,所有引用这个数组的客户端的arrival_time都会同步跟着变。最终time_added变成[27],所以除了第一个客户端,其他所有客户端的arrival_time都显示27。

修复方法

把泊松采样的结果转换成单个整数就行,有两种方式:

  1. 取数组的第一个元素:
self.arrival_time_delay = np.random.poisson(5, size=1)[0]
  1. 直接省略size=1参数,默认返回单个数值:
self.arrival_time_delay = np.random.poisson(5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:36:04