【问题标题】:Continue with for loop after certain ammount of time一定时间后继续 for 循环
【发布时间】:2017-08-12 13:08:26
【问题描述】:

如果给定的迭代花费超过一定的时间,您将如何移动到 for 循环的下一个迭代?代码应该看起来像这样。

for i in range(0, max_iterations):
       timer function
       call to api

如果 api 尚未完成,计时器函数将用于强制 for 循环继续进行下一次迭代。该迭代应该在 120 秒内工作。定时器函数怎么写?提前谢谢!

【问题讨论】:

  • 我不知道 time.sleep(secs) 在这种情况下会有什么用处。如果我将 time.sleep 放在 api 调用之前,程序将等待执行 api 调用。我没有将 time.sleep 放在 api 调用中的选项。
  • 消失了是什么意思?我仍然可以看到piro's accepted answer 但是,ATOzTOA's answer 可能更适合您。
  • Jeremy Farrell 在这里发布了一个答案,告诉你使用time.sleep 来做超时。但后来他意识到他误解了你的问题,并改变了他的答案,将你链接到一些你可能会觉得有用的信息。但随后他删除了修改后的答案。我将在下一条评论中重新发布 Jeremy 的链接。
  • Jeremy 说:解决这个问题的一种方法是使用线程。有关使用事件线程的教程,请参阅A basic example of threads synchronization in Python。一般的想法是在一个单独的线程上运行你的调用,每隔一段时间检查一次结果。对于另一种选择,请参阅此答案:stackoverflow.com/a/14924210/2109767

标签: python python-2.7 timeout


【解决方案1】:

这只有通过非阻塞 API 调用或超时 API 调用才能真正实现。例如,如果您使用的是套接字库,则可以使用socket.setblocking(0) 使套接字 API 调用非阻塞。

在您的情况下,您说您正在使用 Yandex API。这似乎是基于 https 的 JSON,因此您不妨试试urllib2.urlopen()。此方法接受超时。这比使用非阻塞调用更容易,因为urlopen() 会在超时后简单地放弃并返回错误。

使用某些 cmets 中建议的线程将为您提供部分解决方案。由于无法停止使用 threading 模块启动的线程,因此您启动的所有未完成的 API 调用将在 Python 解释器的生命周期内保持阻塞状态,并且这些线程永远不会退出。

如果你确实使用线程模块来解决这个问题,你应该让所有运行 API 的线程调用守护线程thread.setDaemon(True),这样当你的主线程退出时,解释器就会停止。否则,在所有 API 调用完成并返回之前,解释器不会退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多