【问题标题】:python create random list of numbers along with a fixed incrementpython创建随机数字列表以及固定增量
【发布时间】: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


【解决方案1】:

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)

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

【讨论】:

  • 如果我不希望到服务器的流量是随机的,这将起作用。我在这里只提到了相关的细节,所以随机性的必要性可能并不明显。但正如标题所说,需要(伪)随机性。
  • @grill05 为什么你说这行不通?该集合是随机创建的(我使用了与您相同的写作风格),然后您决定是发送查询还是 result_request
  • 可能我理解错了,但是注意如果查询1是在3分钟的时间发送的,那么响应1只能在13分钟后才可以查看。因此,假设如果要根据抛硬币决定是否在序列中的特定点发送查询/检查结果(比如在第 8 点或第 12 点),它可能不起作用。为了澄清你能否写一些关于“你决定是发送查询还是发送结果请求”的代码/伪代码。谢谢
  • @grill05 检查新的编辑 ;) 如果您发送 4 个查询,然后每次询问一个结果和一个查询,则不能低于 10 分钟!如果您想知道如何保留查询和请求的顺序,我建议您使用队列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2011-05-09
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多