虽然 OS 上浏览器和编译程序之间的真正区别

While true difference between browser and a compiled program on the OS

今天在他的Raspberry Pi上Python看了我程序的一个同事的一个小游戏。游戏引擎 运行 使用 while(true) 或无限循环。我自己在 PHP 中使用了一个使用 while(true) 的 websocket 程序。在这些示例中,使用了无限 while 循环,它不会导致程序停止响应。没有它,它将无法正常工作。但是在 JavaScript 中,我们需要不惜一切代价避免无限循环。当循环变得无限时,浏览器会挂起并变得无响应。

我的问题:编译后的Python程序中的无限循环运行有什么区别和一个 无限循环 在浏览器中用 JavaScript 运行 编写?

不同之处在于 JavaScript 在浏览器的 UI 线程上运行(防止它抽取正常的 OS 消息,如绘画),而 Python 程序不没有 UI,因此主线程是否被您的代码占用并不重要。

你仍然以任何一种方式阻塞主线程,但在不同的上下文中。

在 Python 中,您的循环可能如下所示:

while true:
    TakeInput()
    DoStuff()

所以循环的每次迭代都会做一些事情,并且会一直做下去。

在JavaScript中,输入通常来自浏览器。如果您的 JavaScript 代码永远循环,浏览器将永远没有机会让您的代码知道新输入已到达。

你可以这样写 JavaScript 代码:

while (true) {
    x = input('Give me input!');
    // Process x
    alert(result);
}

这将近似于 Python 代码,但这不是 JavaScript 通常工作的方式,并且一起回避浏览器。

Javascript 具有异步 运行 时间,这意味着您的代码通常不必等待其他部分继续。您可以 运行 无限非阻塞循环 setInterval(fn, time)time 毫秒的间隔执行函数 fn

Python 和 JavaScript 代码之间的主要区别是 Python 代码负责更新 UI,而 JS 代码只是循环它是游戏逻辑,因此阻止浏览器更新其视图。

当你制作游戏时,你通常会进入一个循环,在这个循环中,第一个调用会进入游戏逻辑以更新位置、玩家健康、猫数等等。之后,您调用渲染方法,以便您更新的内容被处理为图片并发送到屏幕。然后你重新开始。在 JavaScript 中,您省略了对渲染函数的调用,因此浏览器的 UI 永远不会更新。

这与线程无关,但在像 Pyhton(和许多其他语言)这样的语言中,您可以将游戏逻辑和渲染分开,这样当您的逻辑需要一段时间才能完成时,它会重新定位程序仍然能够更新您的屏幕(一遍又一遍地使用相同的、未更新的内容,但这是另一个话题)。

TL;DR JavaScript 阻塞了浏览器的渲染过程,而 Python 循环显式调用了它的渲染函数 UI.

如@RúnarBerg 所述,对于 JS,您应该使用 setInterval(function, time)

编辑:@mouser 指出您还可以使用 web workers,这似乎是 JS 中多线程的 html5 方法。如果您正在使用 JS 开发游戏,那么它可能值得一看,特别是因为根据 w3schools,所有主要浏览器都支持它。