【问题标题】:Python while loop that does 5 iterations every 60 secondsPython while 循环每 60 秒执行 5 次迭代
【发布时间】:2024-06-03 01:30:01
【问题描述】:

我有一个 python 函数,它从alphavantage.co 请求外汇数据。但是我遇到的问题是,我需要在每 5 次迭代后“暂停”请求 60 秒,因为 alphavantage 文档规定我每分钟只能发出 5 个请求。

我尝试构建一个简单的 while 循环,因为我认为这是最好的方法,但我没有获胜。我构建的 while 循环对第一个元素进行了 6 次迭代,休眠 5 秒并退出循环。就是这个样子

import time
items = ['A','B','C','D','E','F','G','H','I']
n = 0
for i in items:
    while n < 6:
        print(i)
        n = n + 1
    else:
        time.sleep(5) # Delay for 5 seconds (5 seconds).

输出:

A
A
A
A
A
A

这是我所期望的:

A
B
C
D
E
# delay for 5 seconds
F
G
H
I
# exit loop

我对 while 循环的了解显然有限。我很感激这方面的一些帮助。即使这是一种完全不同的方法,只要我可以在一定次数的迭代后暂停一个循环一定的时间。如果您想查看我在此question 上提供的实际功能@

【问题讨论】:

  • 每次迭代后暂停 12 秒是一个合理的答案吗?
  • 使用if 而不是while
  • 如果你需要 5 个请求/分钟,为什么每次运行后不睡 12 秒? 5次连续迭代后是否强制休眠?
  • 你永远不会在你的while循环中改变i,因此它总是保持"A"
  • 我认为我不应该解释基本的数学。您在 60 秒内有 5 个请求,您可以按照自己的方式安排它们。如果连续运行 5 次后不需要等待 60 秒,我相信 5 次睡眠 12 秒就可以了。

标签: python for-loop while-loop


【解决方案1】:

您的while 循环没有任何意义。您需要检查您的迭代以及它是否可以被 5 sleep 整除。要获取迭代的索引,您可以使用enumerate 函数:

import time
items = ['A','B','C','D','E','F','G','H','I']

for i, item in enumerate(items):
    print(item)
    if i % 5 == 4: # each fifth iteration
        time.sleep(60)

另一种方法是每次迭代休眠 12 秒:

import time
items = ['A','B','C','D','E','F','G','H','I']

for item in items:
    print(item)
    time.sleep(12)

【讨论】:

  • 感谢您。我选择了Elads 答案,因为它与我在实际功能中已有的无缝集成。你的当然也可以
【解决方案2】:

这应该符合您的描述:

for n,i in enumerate(items):
    print(i)
    if n%5 == 4:
        time.sleep(5) # Your text said 60 seconds, but your code said 5

【讨论】:

    【解决方案3】:

    当您处于while 循环中时,i 从未改变。如果您希望结果与您预期的一样,可以这样做:

    import time
    items = ['A','B','C','D','E','F','G','H','I']
    n = 0
    for i in items:
        print(i)
        n = n + 1
        if n % 5 == 0 and n != 1:
            time.sleep(5) # Delay for 5 seconds (5 seconds).
    

    甚至不使用while循环。

    当然,如果您想暂停 60 秒,只需在 time.sleep() 函数中更改即可。

    【讨论】:

    • 对于足够长的列表,这将无法正常工作..
    • @ScottHunter 为什么?我在这里看不到问题
    • 您是否尝试列表足够长,需要 2 或 3 次暂停?
    • @Elad,谢谢你。我正在选择您的答案,因为它与我已有的内容更好地结合在一起。我不必在实际功能中更改太多东西