首页 > 解决方案 > python创建随机数字列表以及固定增量

问题描述

我有一个长时间运行(几个小时)的脚本,它会定期向服务器发送查询。服务器对负载非常敏感,因此查询很稀疏(每 3 分钟不超过 1 个)。

服务器将始终花费 10 分钟来处理查询。所以我可以在发送 10 分钟后随时检查查询 1 的结果。

所以有两种操作,“发送查询”和“查询查询结果”。我希望所有操作都以随机间隔发生(受制于相邻操作之间至少有 3 分钟的限制)

按照这个答案(https://stackoverflow.com/a/51918697/10690958)中的建议,我可以生成一个整数的时间序列,使得它们之间至少有 3 个间隔。让我们都成为系列 1。

我还可以生成类似的时间序列状态检查查询(它们之间 3 分钟)。让我们将此系列称为 2。

现在系列 1 是随机间隔的。系列 2 也是随机间隔的。但是系列1和系列2之间存在相关性,即“响应时间”=“查询时间”+10分钟。

这系列 1 和 2 的并集不会是随机的。此外,存在(非常小的)碰撞可能性。例如,查询 2 可能正好在检查查询 1 的结果时发出。

有没有办法使两个序列的结合也完全随机,并避免发生碰撞的可能性。理想情况下,到服务器的所有流量(无论是查询还是状态检查)都应该是完全随机的时间间隔。

我意识到标题不是很具有描述性,但想不出更好的方式来描述这种情况。如果您认为您有更好的描述,请编辑。

例如:

query_sequence=set([3,8,12,21,37])
check_result_sequence=set([13,18,22,31,47])
server_traffic=query_sequence.union(check_result_sequence)

但是他们的联合(server_traffic)不是随机的,因为

check_result_sequence=query_sequence+10

PS:生成更细粒度的时间点可能有助于降低冲突概率(如评论中所述)。至于两个序列联合的随机性,我没有看到任何令人满意的解决方案。我最终决定做的是

check_result_sequence=query_sequence+10+( 5*random.random())

这会为响应序列添加随机“抖动”,因此应该有助于减少两个序列之间的相关性。

标签: pythonrandompython-requests

解决方案


1)我几乎看不到随机化请求间隔的必要性

2)你可以做一个列表:一个代表提交请求的可用时刻的列表

server_traffic=set([3,8,12,15,19,23,26,30,34,40])
for x in range(4):
    send_query(server_traffic)
while(True):
    send_result_request(server_traffic)
    send_query(server_traffic)

然后,每次您决定是否要使用自己的策略发送查询或检查结果时。这应该使一切变得更容易


推荐阅读