无限循环被教导为邪恶。有没有好用?
当偶然对它们进行编码时,CPU达到峰值并且我想象内存也是如此,特别是如果在循环内部分配变量。
如果有好用,那么这些问题是如何防止的?
答案 0 :(得分:6)
基本上每个操作系统或服务器都在infinte循环中旋转。
为了避免这些内存问题,通常不会在循环内部分配内存,除非稍后可以在同一循环中释放它。例如,您将为请求分配内存,并在提供请求后将其删除。
为了避免cpu峰值,你会在os的情况下等待中断,或者调用像poll()这样的阻塞函数,每次迭代都会等待一次新事件。
答案 1 :(得分:4)
首先,这句话中的“无限”这个词应该更宽松一些。我假设您正在讨论带有while (true)
指令的break
循环,其中将最终结束,而不是一个循环将持续到时间结束并且所有人类
在前一种意义上,是的, 是适当的用例:
游戏使用无限game loops。
嵌入式程序使用无限main loops。
Windows应用程序使用无限message loops。
可能不恰当地使用它们的一个例子是当它们被用来通过旋转CPU来创建时间延迟时,这是新手程序员为避免处理定时器中断(或定时器事件或其他非过程构造)而应该做的事情。 )。但是,当旋转CPU完成获取共享资源时,“无限循环”也是完全有效的实现选择。例如,即使是.NET CLR Monitor,也会在对内核事件句柄发出真正的等待并创建更昂贵的线程切换之前尝试spinning for several hundred cycles。
答案 2 :(得分:2)
除了在事件循环上运行的程序(如@Christoph提到的系统进程)之外,某些语言还有一个称为generator的概念,它允许甚至鼓励您编写无限循环。诀窍在于,当对象“产生”(返回)某个表达式时,该对象仅运行一段有限的时间。之后,它的状态被“冻结”,直到再次需要它。例如,在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:
的无限循环,但它每次调用只会运行一段有限的时间。