我需要在Python中像PHP一样使用Node.js吗?

11

我已经使用PHP有一段时间了。我一直在考虑学习Node.js并与之结合使用,以利用非阻塞的思想创建在线游戏或应用程序。关于如何同时使用这两个技术有很多信息。在游戏的后端使用Node可以真正加速游戏的某些方面,特别是如果允许用户实时互相对战。

最近,我也开始研究学习Python(是的我有很多闲暇时间)。它有许多PHP所没有的功能,我很喜欢。但是对于像我之前用PHP考虑使用Node.js来做后台工作的情况,我找不到太多有关Python的信息。我也注意到Python确实有一些线程功能。由于我还很陌生于Python的世界,我是否需要Node.js?Python是否可以处理Node.js所能处理的这些功能?还是说使用Node仍然有好处,我实际上需要它。

顺便说一下,自从我开始查找关于Python的信息以来,我发现Twisted似乎是另一个像Node一样的框架。但是Twisted是用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,因为我喜欢这种语言的一般功能。

  • 我认为这个选项比第三个更可行,使用Twisted处理网络端口,允许玩家相互实时游戏。

  • 这只是使您不必学习JS,对我来说似乎并不是很重要。我已经开始学习它了,学起来并不难。但就像在一个问题中提到的那样,混合使用诸如;和{}可能会有一些问题。

  • 类似于#2,但使用Node.js。主要是看到添加Node来处理网络方面,使玩家能够进行实时游戏/实况游戏。绝大部分代码将使用Python编写。

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

  • 与#5类似,但在阅读评论之前我没有考虑仅使用Twisted。虽然看起来是可行的,但它并没有涉及我想学习的两种语言之一,Python和Node。

  • 以上似乎是我可以走的主要路线。现在我仍然不确定要走哪条路线。我真的想学习Node和Python。因此,似乎我只需要分别学习这两个东西。但我仍然需要为这个项目选择一个选项。到目前为止,我喜欢2和5号,6号靠近5号,因为Node和Twisted具有一些非常相似的功能。1号作为提及,因为那是我已经知道的。但我还想学点新东西。所以,真正的选择是2和5。或者4号,因为它与2号相似。哈,我仍然需要做一些功课。也许这值得再问一个问题。

    编辑(2012年9月19日):我想更新一下,目前我大多数开发都在使用Node.js。而且计划使用Redis实现发布/订阅功能,以呈现实时页面更新的外观,因为我不需要像游戏或配对内容编辑那样的真正实时功能。


    1
    你的第六点是不正确的:Twisted 就是 Python。Twisted 的整个重点是将尽可能多的事件驱动网络内容公开为普通的Python API。 - Glyph
    哦,好的。我明白了。我知道它是用Python编写的,但我想我的看法有点偏颇。 - skift
    值得注意的是,Python 是一种语言,Twisted 将 Python 扩展到了 Web,Node.js 则将 Javascript 扩展到了 Web。就像你不能在 PHP 中使用 Ruby on Rails(除非你想要花费大量精力来将两个不该被组合的组件合并在一起),你也不能使用 Twisted 和 Node.js,也不能使用 Node.js 和 Python。 - TheEnvironmentalist
    5个回答

    9

    虽然Python可以用于异步编程,但与Node.js相比,即使使用Twisted,它也不够自然,不够顺畅。

    由于您计划制作实时Web游戏,最有可能最终会使用WebSockets

    WebSockets基于HTTP,并使用升级标头来启动双向连接,这意味着,如果您需要大量的回退以支持旧浏览器,则可以轻松地在端口80上运行您的普通服务器 WebSockets,那么就总有强大的Socket.IO

    根据前端的复杂程度,我宁愿选择express.js或编写自己的代码。

    在同一进程中同时拥有前端和游戏(显然)具有许多优点,您可以获取许多信息而无需查询数据库。

    另一个重要的“特性”是,你不需要在客户端逻辑和服务器逻辑之间切换上下文。起初可能看起来像是一个小小的好处,但除了你不必在 Python 中键入 ;,也不会在 JS 中忘记你的 {},在连续工作几个小时后,你还可以在服务器和客户端之间重复使用代码。再次,这可能一开始看起来像是一个小小的好处,但优秀的多人游戏总是在客户端上运行很多东西,以弥补延迟,而且 Python 和 JavaScript 在某些方面有很大的不同,所以必须在 Python 中重新编写 JS 的部分需要时间,甚至可能会引入错误。

    (现在是无耻的广告时间...)

    我已经用 Node.js 做了两个多人游戏,虽然它们没有 HTTP 前端,但两个游戏都在客户端运行了相当多的 JS:
    Multiplayer Asteroids/Geometry Wars Crossover
    RTS Concept (a bit like Eufloria)

    此外,虽然JSON似乎非常适合在浏览器和客户端之间发送数据,但您很快就会发现它使用了大量的带宽。由于我遇到了同样的问题,所以我编写了一些专门的库,可以节省高达45%的流量:
    BiSON.js 再次强调,将JavaScript同时用于服务器和客户端可以重复使用代码,因此节省开发时间。
    因此,总结所有内容,我强烈建议使用Node.js:
    1. 可重复使用的代码,减少上下文切换,从而缩短开发时间
    2. V8在许多情况下比Python更快。
    3. 没有并发问题,默认情况下所有内容都是异步的。
    4. Node.js是下一个大事件,现在就加入吧。
    5. 这是JavaScript! ;)

    是的,在两端使用相同的编程语言确实很有吸引力。但是对我来说,使用两种编程语言并不感到那么遥远,因为这与使用JS和PHP的想法是一样的。不久前,我研究了两个Node.js框架,Express和Geddy。但我没有在任何一个方面做太多的功课。如果我使用Node,我想使用一个框架,因为我知道它们可以带来多大的好处。 - skift
    此外,关于BiSON,这让我想起了mongodb,它使用二进制JSON。我想在开发中使用它。所以我不确定它会如何与BiSON混合使用。就像之前提到的那样,我还有一些功课要做。 - skift
    @luckysmack,有几种不同的“二进制”JSON类似物,我不知道Mongo确切使用哪一种,但我想他们使用的不是专注于尺寸小而是快速读取的那种。普通的JSON在阅读速度方面并不是最好的选择,因此做一个二进制的,并打包附加信息将会大大提高速度。 - Ivo Wetzel
    虽然Python绝对可以用于异步编程,但即使使用Twisted,它也不太自然。与Node.js相比,它看起来或感觉上都不那么好。你认为是为什么呢? - Artur Gaspar
    自从我提出这个问题以来,Python 现在已经拥有了 async/await,并且在这方面做得更好了。目前,我确实使用一些 Node,但主要关注 Python。 - skift

    2

    我认为之所以使用Twisted更好,并不是因为它是Python-on-Python,而是因为你可以在Twisted中同时完成游戏部分和Web部分。

    编辑:

    此外,还有Pyjamas


    是的,这就是Node.js的吸引之处,我可以使用同一种主要语言编写整个代码,而不是将服务器和客户端分开。我还想学习Python,因为它具有PHP没有的其他功能。作为一种通用脚本语言,它要好得多,这也是我想要探索的可能路线之一。 - skift

    2
    如果你喜欢回调式编程,Twisted和Node.js就是适合你的东西。否则,你可以看看 gevent。它类似于Twisted/Node.js,是一个异步框架,但它允许你像使用线程的方式编写代码。
    它通过在幕后进行基于协程的魔法来实现这一点。

    gevent和Twisted不能像这样进行比较。Twisted是一个高度功能丰富的网络编程库,除了用于编写事件驱动程序的库之外。gevent具有少量的网络编程功能和仅有的事件驱动编程系统。它基本上只是协程的包装器(如果您喜欢协程,可以找到类似的东西,实际上已经很好地集成到Twisted中)。 - Jean-Paul Calderone

    1
    使用Node.js的整个重点在于其优势,这些优势在http://nodejs.org/#about中有很好的文档记录。虽然您可以使用服务器端语言和前端堆栈来满足您的需求,但我认为将所有代码都写在一个语言中将极大地提高生产力。
    如果我是您,我会尽可能地尝试在一种语言中编写大部分代码。因此,我不认为您应该尝试将Node.js与Python(Twisted或Tornado)一起使用。它们似乎存在某种重叠。
    想象一下,用JavaScript编写所有代码的酷炫感觉吧。 ;)

    JavaScript 何时成为一门酷炫的语言?就我个人而言,我讨厌它,特别是那种“一切皆为字符串/浮点数”的类型。还有继承机制,以及每个浏览器处理方式略有不同。框架确实有很大帮助,但这门语言仍然很糟糕 :) 如果可能的话,我会在服务器和客户端都使用 Python 来编写。 - wump

    0

    听起来你在谈论的是需要一个系统来异步地进行某种后台处理。如果是这样,你可以考虑使用某种队列系统。这样,你可以将消息放入队列中,直到被一组工作进程处理。

    Celery使这个过程变得非常容易,但如果你以前没有配置过RabbitMQ(或其他消息代理),那么可能会有些麻烦。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接