一定时间后继续 for 循环
Continue with for loop after certain ammount of time
如果给定的迭代花费的时间超过一定时间,您如何才能移动到 for 循环的下一次迭代?代码应该看起来像这样。
for i in range(0, max_iterations):
timer function
call to api
如果 api 尚未完成,定时器功能将用于强制 for 循环继续下一次迭代。对于该迭代,它应该在 120 秒内工作。定时器函数怎么写?提前致谢!
这只有通过非阻塞 API 调用或 API 超时调用才能真正实现。例如,如果您正在使用套接字库,则可以使用 socket.setblocking(0)
使套接字 API 调用成为非阻塞。
在你的情况下,你说你正在使用 Yandex API。这似乎是 JSON over https,因此您不妨尝试 urllib2.urlopen()
。此方法接受超时。这比使用非阻塞调用更容易,因为 urlopen()
将简单地放弃并且 return 在超时到期后出现错误。
按照某些评论中的建议使用线程将为您提供部分解决方案。由于无法停止使用线程模块启动的线程,因此您发起的所有未完成的 API 调用将在 python 解释器和那些线程的生命周期内保持阻塞状态永远不会退出。
如果你确实使用线程模块来解决这个问题,你应该让 运行 API 调用守护线程的所有线程 thread.setDaemon(True)
这样当你的主线程退出时, 解释器停止。否则解释器将不会退出,直到所有 API 调用都完成并 returned.
如果给定的迭代花费的时间超过一定时间,您如何才能移动到 for 循环的下一次迭代?代码应该看起来像这样。
for i in range(0, max_iterations):
timer function
call to api
如果 api 尚未完成,定时器功能将用于强制 for 循环继续下一次迭代。对于该迭代,它应该在 120 秒内工作。定时器函数怎么写?提前致谢!
这只有通过非阻塞 API 调用或 API 超时调用才能真正实现。例如,如果您正在使用套接字库,则可以使用 socket.setblocking(0)
使套接字 API 调用成为非阻塞。
在你的情况下,你说你正在使用 Yandex API。这似乎是 JSON over https,因此您不妨尝试 urllib2.urlopen()
。此方法接受超时。这比使用非阻塞调用更容易,因为 urlopen()
将简单地放弃并且 return 在超时到期后出现错误。
按照某些评论中的建议使用线程将为您提供部分解决方案。由于无法停止使用线程模块启动的线程,因此您发起的所有未完成的 API 调用将在 python 解释器和那些线程的生命周期内保持阻塞状态永远不会退出。
如果你确实使用线程模块来解决这个问题,你应该让 运行 API 调用守护线程的所有线程 thread.setDaemon(True)
这样当你的主线程退出时, 解释器停止。否则解释器将不会退出,直到所有 API 调用都完成并 returned.