【发布时间】:2018-12-07 12:35:05
【问题描述】:
我有一个长时间运行(几个小时)的脚本,它会定期向服务器发送查询。服务器对负载非常敏感,因此查询很稀疏(每 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
附: 生成更细粒度的时间点可能有助于降低冲突概率(如评论中所述)。至于两个序列联合的随机性,我没有看到任何令人满意的解决方案。我最终决定做的是
check_result_sequence=query_sequence+10+( 5*random.random())
这会为响应序列添加随机“抖动”,因此应该有助于减少两个序列之间的相关性。
【问题讨论】:
-
您能举例说明您期望的结果吗?我还不是很清楚。
-
我不清楚的部分,如果我发送了查询请求 1 并且我只会在 10 分钟后得到输出,我可以在 3 分钟后发送查询 2 请求吗?跨度>
-
是的。可以随时发送查询(它们之间的最小距离为 3 分钟)。响应将在 10 分钟后可用(即服务器恰好需要 10 分钟来处理每个查询)。需要规定最小距离以减少服务器负载。查询服务器会增加负载(服务器使用 cpu/gpu/memory 来处理查询)。检查状态不会增加服务器负载(因为处理已经完成)。请注意,这些是“稀疏”序列,即大部分时间脚本在向服务器发送流量之间处于休眠状态。
-
您的示例包括以分钟为单位的粒度。您可以改为生成以秒或毫秒为单位的间隔,甚至更细化的单位,以降低发生冲突的风险。
标签: python random python-requests