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。
修复方法
把泊松采样的结果转换成单个整数就行,有两种方式:
- 取数组的第一个元素:
self.arrival_time_delay = np.random.poisson(5, size=1)[0]
- 直接省略
size=1参数,默认返回单个数值:
self.arrival_time_delay = np.random.poisson(5)
内容的提问来源于stack exchange,提问作者yav dat
相关产品推荐
相关产品推荐

