无限循环被教导为邪恶。有什么好用的吗?
意外编码时,CPU 会达到峰值,我想内存也会达到峰值,尤其是在循环内分配变量时。
如果有好的用途,如何预防这些问题?
无限循环被教导为邪恶。有什么好用的吗?
意外编码时,CPU 会达到峰值,我想内存也会达到峰值,尤其是在循环内分配变量时。
如果有好的用途,如何预防这些问题?
基本上每个操作系统或服务器都在无限循环中旋转。
为了避免这些内存问题,您通常不会在循环内分配内存,除非它可以稍后在同一个循环内释放。例如,您将为请求分配内存并在服务完成后将其删除。
为了避免 cpu 峰值,您将在操作系统的情况下等待中断,或者调用像 poll() 这样的阻塞函数,该函数在每次迭代时等待一个新事件。
首先,这个短语中的“无限”这个词应该更宽松一点。我假设您正在谈论一个while (true)
带有break
指令的循环,该指令最终将结束,而不是一个将运行到时间和全人类结束的循环。
从前一种意义上说,是的,有些用例是合适的:
可能不恰当地使用它们的一个例子是当它们被用来通过旋转 CPU 来创建时间延迟时,这是新手程序员倾向于避免处理定时器中断(或定时器事件或其他非程序结构)的做法。但是,当旋转 CPU 以获取共享资源时,“无限循环”也是一个完全有效的实现选择。例如,即使是 .NET CLR 监视器也会尝试旋转数百个周期,然后才会对内核事件句柄发出真正的等待并创建更昂贵的线程切换。
除了在事件循环上运行的程序(如@Christoph 提到的系统进程)之外,一些语言还有一个称为生成器的概念,它允许甚至鼓励您编写无限循环。诀窍是该对象仅在“产生”(返回)某个表达式时才运行有限的时间。之后,它的状态被“冻结”,直到再次需要它。例如,在 Python 中,您可以拥有一个在LEFT
和之间交替的对象RIGHT
:
def side():
while True:
yield "LEFT"
yield "RIGHT"
a = side()
print a.next()
print a.next()
print a.next()
哪个会给LEFT RIGHT LEFT
。该side
函数看起来像一个带有语句的无限循环While True:
,但每次调用它只会运行有限的时间。