【问题标题】:Do i need Node.js in Python like I would with PHP?我是否需要 Python 中的 Node.js,就像使用 PHP 一样?
【发布时间】:2011-05-15 15:24:13
【问题描述】:

我使用 PHP 已经有一段时间了。我一直在考虑学习 Node.js 以配合它使用非阻塞思想来创建在线游戏或应用程序。有很多关于将两者结合使用的信息。使用 Node 作为游戏后端的一部分确实可以加速游戏的某些方面,特别是如果游戏允许用户实时对战。

嗯,最近我也一直在研究学习 Python(是的,我手头有很多时间)。 PHP 有很多我非常喜欢的特性。但是对于使用 Node.js 来做后台工作,就像我正在考虑使用 PHP 一样,我根本找不到太多信息。我还注意到 Python 确实有一些线程特性。由于我对 Python 的世界还很陌生,我什至需要 Python 中的 Node.js 吗? Python 可以处理 Node.js 可以处理的这些特性吗?或者使用 Node 是否还有好处,或者我真的需要它。

附带说明一下,自从我开始查找 Python 以来,我还发现了 Twisted,它似乎是另一个框架,如 Node.js。但是 Twisted 是用 Python 编写的。因此,在上述任何一种情况下,Twisted 都会更好(除了 Twisted 似乎已经存在的时间更长并且比 Node 更稳定的事实)。我的意思是总的来说它值得使用,无论是 Node 还是 Twisted?如果是这样,使用 Python 是否比另一个更好?

很抱歉这个大问题,但我在这方面非常不确定和 n00b。谢谢。


就目前而言,在阅读了有用的答案后,我看到了以下选项:

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

  1. 我已经了解 PHP 并且对它很熟悉,目前正在学习 JS。这对我来说是一条主要的可能路线。但我也从 PHP 转向 Python,因为我喜欢这门语言的一般特性。

  2. 我认为这个选项可能比 #3 更合理,使用 Twisted 处理网络端口,让玩家可以互相直播。

  3. 这只是让您不必学习 JS,在我看来这没什么大不了的。我已经开始研究它了,它并不难学。但是就像在一个问题中提到的那样,混合了 ;并且 {} 可能存在一些问题。

  4. 与 #2 类似,但使用的是 Node.js。大多数情况下,我看到添加 Node 来处理网络方面,让玩家能够在现场/实时游戏中玩。而且大部分代码都在 Python 中。

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

  6. Ans as #5 但在阅读 cmets 之前,我并没有考虑唯一的 Twisted 路线。虽然看起来很合理,但它并不真正涉及我想学习的两种语言中的一种,Python 和 Node。

以上似乎是我可以走的主要路线。现在我仍然不确定要走哪条路。我真的很想同时学习 Node 和 Python。所以看来我可能只需要分别学习这两个。但我仍然需要为这个项目选择一个选择。到目前为止,我喜欢数字 2 和 5,其中 6 接近 5,因为 Node 和 Twisted 有一些非常相似的功能。 1 作为提及,因为那是我已经知道的。但无论如何我都想学点新东西。所以,仍然是数字 2 和 5。或者 4,因为它类似于 2。哈,我仍然需要做一些功课。也许它值得另一个问题。

编辑(2012 年 9 月 19 日):我只是想更新一下,说我目前主要使用 Node.js 进行开发。并计划将 Redis 用于 PubSub 功能以提供实时页面更新的外观,因为我不需要像游戏或配对内容编辑那样的真正实时。

【问题讨论】:

  • 您的第 6 点不正确:Twisted Python。 Twisted 的重点在于公开与普通 Python API 一样多的事件驱动网络内容。
  • 哦,好的。我知道了。我知道它是用 python 写的,但我想我对它的看法有点偏差。
  • 值得注意的是,Python 是一门语言,Twisted 将 Python 扩展至网络,Node.js 将 Javascript 扩展至网络。就像您不能将 Ruby on Rails 与 PHP 一起使用(除非您想投入大量的工作来组合两个从未想过的组件),您不能将 Twisted 与 Node.js 一起使用,而且您可以不要将 Node.js 与 Python 一起使用。

标签: php python twisted node.js nonblocking


【解决方案1】:

虽然 Python 绝对可以用于异步编程,但感觉并不自然,即使使用 Twisted,如果您将它与 Node.js 进行比较,它看起来或感觉都不太好

由于您计划制作实时网页游戏,因此您很可能最终会使用WebSockets

WebSockets 基于 HTTP 并使用升级标头来启动双向连接,这意味着您可以轻松地让您的普通服务器 您的 WebSockets 在端口 80 上运行,如果您需要很多后备来支持旧版浏览器,然后总会有全能的Socket.IO

根据您的前端的复杂程度,我宁愿使用express.js 或只写我自己的东西。

将前端和游戏放在同一个进程中(显然)有很多优势,您可以获取大量信息而无需查询数据库。

另一个大“特性”是,您不必在客户端逻辑和服务器逻辑之间进行上下文切换。起初这似乎是一个小好处,但除了你不会在 Python 中键入 ; 并且在任一侧连续工作几个小时后不要忘记你在 JS 中的 {} 之外,你还将能够在服务器和客户端之间重用代码。同样,起初这可能看起来像是一个小好处,但是好的多人游戏总是在客户端上运行很多东西,只是为了弥补滞后,Python和JavaScript也有很大的不同,所以不得不重写部分JS在 Python 中使用需要时间,甚至可能会引入错误。

(现在开始无耻的插头......)

我已经使用 Node.js 完成了 2 款多人游戏,尽管这两款游戏都没有 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,我想使用一个框架,因为我知道它们可以带来多大的好处。
  • 另外,关于 BiSON,这让我想起了使用二进制 JSON 的 mongodb。我想将其用于开发。所以我不确定这将如何融入 BiSON。就像之前提到的,我还有一些功课要做。
  • @luckysmack 有几个不同的“二进制” JSON 类似,我不知道 Mongo 使用什么,但我想他们使用的不是专注于小尺寸,但是阅读速度相当快。就读取速度而言,普通的 JSON 并不是最好的,所以做一个二进制文件并打包额外的信息会大大提高速度。
  • “虽然 Python 绝对可以用于异步编程,但感觉并不自然,即使使用 Twisted,如果你将它与 Node.js 进行比较,它看起来或感觉都不是那么好” 为什么你这么认为吗?
  • 既然我问了这个问题,python 现在有了 async/await 并且在这方面做得更好。目前,我确实使用了一些节点,但主要关注 python。
【解决方案2】:

我认为它不是更好,因为它是 Python-on-Python,而是因为您可以在 Twisted 中同时完成游戏部分网络部分。

编辑:

另外,Pyjamas

【讨论】:

  • 是的,这与 node.js 的相同之处在于,我可以用一种主要语言编写整个代码,而不是将服务器端和客户端分开。我还想学习 python 的一些 php 没有的其他功能。它作为通用脚本语言要好得多,这就是为什么它是我想采取的可能路线之一。
【解决方案3】:

如果您喜欢面向回调的编程,twisted 和 nodejs 就是您的理想之选。否则,您可以查看gevent。它类似于twisted/nodejs,因为它是一个异步框架,但它允许您像在线程方法中那样编写代码。

它通过在幕后执行基于协程的魔法来实现这一点。

【讨论】:

  • gevent 和 Twisted 没有可比性。除了用于编写事件驱动程序的库之外,Twisted 是一个功能强大的网络编程库。 gevent 几乎没有网络编程功能,只有一个事件驱动编程系统的裸存根。它基本上只是对协同程序的一个包装(如果你喜欢协同程序,你可以找到实际上很好地集成到 Twisted 中的类似东西)。
【解决方案4】:

使用 Node.js 的全部意义在于它的优势,这在 http://nodejs.org/#about 中有详细记录。虽然您当然可以使用服务器端语言和前端堆栈来满足您的需求,但我认为用一种语言编写所有代码将极大地提高生产力。

如果我是你,我会尽量用一种语言编写我的大部分代码。所以我认为你不应该尝试将 Node.js 与 Python(Twisted 或 Tornado)一起使用。它似乎有某种重叠。

想象一下用 JavaScript 编写所有代码是多么酷。 ;)

【讨论】:

  • javascript什么时候变成了很酷的语言?就个人而言,我讨厌它,尤其是“一切都是字符串/浮点数”的输入。以及继承机制。每个浏览器的处理方式略有不同。框架有很大帮助,但语言仍然很烂:) 如果可能的话,我会在服务器端和客户端都编写 Python。
【解决方案5】:

在我看来,您好像在谈论建立一个系统来在后台执行某种您想要异步执行的处理。如果是这种情况,您可能会考虑使用某种排队系统。通过这种方式,您可以将消息放入队列,直到它被工作进程池处理。

Celery 使这很容易做到,但是如果您以前没有这样做过,正确配置 RabbitMQ(或其他消息代理)可能会有点痛苦。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多