我在Python中是否需要Node.js,就像在PHP中一样?

11 投票
5 回答
4268 浏览
提问于 2025-04-16 07:36

我已经使用PHP一段时间了。最近我在考虑学习Node.js,想用它来实现非阻塞的想法,创建一个在线游戏或应用。关于这两者一起使用的信息还挺多的。把Node作为游戏的后端部分,可以加快游戏的某些方面,特别是如果游戏允许用户实时对战的话。

最近我也在考虑学习Python(是的,我有很多时间)。我发现Python有很多我喜欢的功能,比PHP要好。不过,关于如何用Node.js做背景工作,我找不到太多信息。我还注意到Python确实有一些线程功能。由于我对Python还很陌生,我真的需要在Python中使用Node.js吗?Python能处理Node.js能做的这些功能吗?或者使用Node.js还有其他好处,或者我真的需要它吗?

顺便提一下,自从我开始了解Python,我还发现了Twisted,这似乎是一个类似Node的框架,但它是用Python写的。那么在上述两种情况下,Twisted会更好吗(除了Twisted似乎比Node更成熟、更稳定)?我只是想知道,使用Node或Twisted是否值得?如果值得的话,哪一个在Python中更好呢?

抱歉问了这么大的问题,我在这个领域真的很不确定,还是个新手。谢谢。


所以,经过阅读有帮助的回答后,我看到以下选项:

  1. PHP + JS
  2. Python + Twisted
  3. Python + PyJamas
  4. Python + Node.js
  5. Node.js
  6. Twisted

  1. 我已经知道PHP,并且对它很熟悉,现在正在学习JS。这是我一个主要的选择。但我也在考虑从PHP转向Python,因为我喜欢这个语言的一般特性。

  2. 我觉得这个选项比第三个更可行,使用Twisted来处理网络端口,让玩家能够实时对战。

  3. 这个选项让你不必学习JS,对我来说这并不是太大的问题。我已经开始学习JS了,发现其实不难。不过,正如问题中提到的,混合使用像;和{}可能会有一些问题。

  4. 和第二个选项类似,但用Node.js。主要是我看到Node可以处理网络方面,让玩家能够在实时游戏中对战。大部分代码会用Python写。

  5. 单独使用Node.js也是一个考虑,因为这是单一语言的选择。但它没有学习和使用Python的好处(Python是我可以在网页设计内外使用的一种通用脚本语言。这也是我想学习和使用它的一个重要原因)。

  6. 和第五个选项类似,但在阅读评论之前我并没有考虑只用Twisted。虽然看起来可行,但这并不涉及我想学习的两种语言,Python和Node。

以上似乎是我可以走的主要路线。现在我还是不太确定该走哪条路。我真的想学习Node和Python。所以看起来我可能需要分别学习这两者。不过我还是需要为这个项目做出选择。目前我比较喜欢第二和第五个选项,第六个选项也接近第五,因为Node和Twisted有一些非常相似的功能。第一项提一下,因为这是我已经知道的。但我还是想学点新东西。所以现在,主要是第二和第五,或者第四,因为它和第二相似。哈哈,我还需要做一些功课。也许这值得再问一个问题。

编辑(2012年9月19日):我想更新一下,告诉大家我目前主要在使用Node.js进行开发。并计划使用Redis来实现PubSub功能,以提供实时页面更新的效果,因为我并不需要像游戏那样的真正实时,或者像配对内容编辑那样的实时。

5 个回答

2

如果你喜欢用回调函数来编程,那么 twisted 和 nodejs 就非常适合你。否则,你可以看看 gevent。它和 twisted/nodejs 一样,都是异步框架,但它让你可以像写多线程代码那样来写你的代码。

它通过在后台使用协程的方式来实现这一点,感觉就像是有魔法一样。

2

我觉得这并不是因为它是用Python写的就更好,而是因为你可以在Twisted里同时做游戏部分和网页部分。

补充:

还有一个叫Pyjamas的东西。

9

虽然Python可以用来做异步编程,但和Node.js比起来,它的感觉就不那么自然了,甚至用上了Twisted也一样。

既然你打算做一个实时的网页游戏,你很可能会用到WebSockets

WebSockets是基于HTTP的,它通过升级头来建立双向连接。这意味着你可以轻松地让普通的服务器和WebSockets都在80端口上运行。如果你需要支持一些老旧的浏览器,那就可以考虑强大的Socket.IO

根据你前端的复杂程度,我更倾向于使用express.js,或者自己写一些东西。

把前端和游戏放在同一个进程中显然有很多好处,你可以获取很多信息,而不需要每次都去查询数据库。

另一个很大的“特点”是,你不需要在客户端逻辑和服务器逻辑之间切换。起初这看起来是个小好处,但除了你在Python中不需要输入;,在JS中也不会忘记{},在两边工作几个小时后,你还可以在服务器和客户端之间重用代码。虽然这看起来也不算什么,但好的多人游戏总是在客户端运行很多东西,以弥补延迟。而且Python和JavaScript的差异很大,所以在Python中重写JS的部分会花费时间,甚至可能引入bug。

(接下来是我的自我推销...)

我已经用Node.js做过两个多人游戏,虽然它们没有HTTP前端,但这两个游戏在客户端运行了很多JS:
多人版小行星/几何战争交叉游戏
RTS概念(有点像Eufloria)

另外,虽然JSON看起来很适合在浏览器和客户端之间传输数据,但你很快会发现它消耗了大量带宽。因为我遇到了同样的问题,所以写了一个专门的库,节省了多达45%的流量:
BiSON.js

再次强调,服务器和客户端都用JavaScript可以重用代码,从而节省开发时间。

所以总结一下,我强烈建议使用Node.js:

  1. 可重用的代码,减少上下文切换,因此开发时间更短
  2. 在很多情况下,V8比Python要
  3. 没有并发问题,一切默认都是异步的。
  4. Node.js是下一个大趋势,赶紧加入吧。
  5. 它是JavaScript! ;)

撰写回答