问题 我是否需要Python中的Node.js?


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

好吧,最近我一直在研究学习Python(是的,我手上有很多时间)。 PHP上有许多关于它的功能,我非常喜欢。但是为了使用Node.js来完成我考虑使用PHP的后台工作,我根本找不到太多信息。我也注意到Python确实有一些线程功能。由于我对Python的世界还很陌生,我甚至需要Python中的Node.js吗? Python可以处理Node.js可以使用的这些功能吗?或者使用Node仍然会有好处,或者我实际上是不是 需要 它。

作为旁注,自从我开始查找Python以来,我还发现了Twisted,它似乎是另一个像Node这样的框架。但是Twisted是用Python编写的。因此,在上述任何一种情况下,Twisted都会更好(除了Twisted看起来更长并且比Node更稳定的事实)。我只是意味着它总是值得使用,无论是Node还是Twisted?如果是这样的话比Python更好吗?

对不起,这是一个很大的问题,但我在这个领域非常不确定和n00b。谢谢。


因此,在阅读有用的答案后,我看到以下选项:

  1. PHP + JS
  2. Python + Twisted
  3. Python +睡衣
  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作为#5,但在阅读评论之前,我没有考虑使用Twisted路线。虽然看起来似乎有道理,但它并不真正涉及我想要学习的两种语言之一,Python和Node。

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

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


6294
2017-11-25 10:52


起源

你的观点6不正确:扭曲 是 蟒蛇。 Twisted的重点是暴露与普通Python API一样多的事件驱动的网络。 - Glyph
哦好的。我懂了。我知道它写的是python,但我想我对它的看法有点偏斜。 - skift
值得注意的是,Python是一种语言,Twisted将Python扩展到Web,Node.js将Javascript扩展到Web。就像你不能在PHP上使用Ruby on Rails(除非你想要组合很多缝合工作来组合两个从未想过的组件),你不能使用Twisted with Node.js,你可以'使用Node.js和Python。 - TheEnvironmentalist


答案:


虽然Python绝对可以用于异步编程,但是即使使用Twisted也不会感觉很自然,如果你将它与Node.js进行比较它只是看起来或感觉不到  不错。

由于你正在计划进行实时网络游戏,你最有可能最终会使用 的WebSockets

WebSockets基于HTTP并使用升级标头启动双向连接,这意味着您可以轻松拥有正常的服务器  您的WebSockets在端口80上运行,如果您需要大量的后备来支持较旧的浏览器,那么总是全能的 Socket.IO

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

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

另一个重要的“功能”是,您不必在客户端逻辑和服务器逻辑之间进行上下文切换。这可能看起来像一个小的好处,但除了你不会打字的事实 ; 在Python中,不要忘记你的 {} 在JS连续工作几个小时之后,你也可以在服务器和客户端之间重用代码。再一次,这可能看起来像一个小的好处,但好的多玩家游戏总是在客户端运行很多东西,只是为了弥补滞后,Python和JavaScript是完全不同的,所以不得不重写JS的部分在Python中需要时间,甚至可能会引入错误。

(现在对无耻的插头......)

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

此外,虽然JSON似乎非常适合在浏览器和客户端之间发送数据,但您很快就会发现它使用了 一吨 带宽,因为我遇到了同样的问题,我写了一些专门的库,节省了 45% 交通:
BiSON.js

再次,在服务器上同时使用JavaScript  客户端允许重复使用代码,从而节省开发时间。

总而言之,我强烈建议使用Node.js:

  1. 可重复使用的代码,更少的上下文切换因此缩短了开发时间
  2. V8是 更快 在很多情况下比Python。
  3. 没有并发问题,默认情况下一切都是异步的。
  4. Node.js是下一个重要的事情,现在就加入潮流。
  5. 这是JavaScript! ;)

9
2017-11-25 13:42



是的,两端的同一种语言很有吸引力。但是使用两个并不是真的感觉到我所有的东西,因为它与使用JS与PHP相同的想法。不久前,我调查了两个node.js框架,express和geddy。但我也没有做过很多功课。如果我使用node,我想使用一个框架,因为我知道它们有多么有用。 - skift
另外,关于BiSON,这让我想起了使用二进制JSON的mongodb。我想用它来开发。所以我不确定它是如何适合与BiSON的混合。再次像前面提到的那样,我还有一些功课要做。 - skift
@luckysmack有几个不同的“二进制”JSON相似,我不知道Mongo使用的确切内容,但我想他们使用的是一个不专注于小尺寸,而是快速读取的。普通的JSON在读取速度方面不是最好的,所以做二进制和打包附加信息会大大提高速度。 - Ivo Wetzel
“虽然Python绝对可以用于异步编程,但它感觉并不自然,即使使用Twisted,如果将它与Node.js进行比较,它看起来或感觉不太好”你为什么这么认为? - Artur Gaspar
因为我问过这个问题,python现在有async / await,在这方面做得更好。目前,我确实使用了一些节点,但主要关注python。 - skift


我认为它不是那么好,因为它是Python-on-Python,但因为你可以同时做两个游戏部分  Twisted中的Web部件。

编辑:

也, 睡衣


2
2017-11-25 10:58



是的,与node.js相同的是,我可以用一种主要语言编写整个事物而不是将服务器和客户端分开。我还想学习python的一些PHP没有的其他功能。它作为一般脚本语言更好,这就是为什么它是我想要采取的可能路线之一。 - skift


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

它通过在幕后进行基于协同程序的魔术来实现这一目标。


2
2017-11-26 10:56



gevent和Twisted没有这样的可比性。 Twisted是一个功能强大的网络编程库,另外还有一个用于编写事件驱动程序的库。 gevent几乎没有网络编程功能,只有事件驱动编程系统的裸存根。基本上就是这样 只是 一个包含协同例程的包装器(如果你喜欢协同例程,你可以找到类似的东西,实际上很好地集成到Twisted中)。 - Jean-Paul Calderone


使用Node.js的全部意义在于它的优点,并且有很好的文档记录 http://nodejs.org/#about。虽然您可以使用服务器端语言和前端堆栈来满足您的需求,但我认为用1种语言编写所有代码将大大提高生产力。

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

想象一下用JavaScript编写所有代码的酷感。 ;)


1
2017-11-26 02:37



什么时候javascript成为一种很酷的语言?就个人而言,我讨厌它,特别是'一切都是字符串/浮动'打字。和继承机制。每个浏览器的处理略有不同。框架有很多帮助,但语言仍然腐烂:)如果可能的话,我会在服务器和客户端编写Python。 - wump


听起来像你在谈论有一个系统来在后台进行某种处理,你想要异步进行。如果是这种情况,您可以考虑使用某种排队系统。这样,您可以将消息放入队列,直到它被工作进程池处理。

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


0
2017-11-25 11:10