启动node.js脚本与python脚本的成本

启动node.js脚本与python脚本的成本,python,node.js,Python,Node.js,我认为用例节点的设计是为了在启动时比python的开销小得多。但有人能通过经验或基准来证实这一点吗 我问这个问题的原因是,我正在做一个项目,在这个项目中,我们每分钟都要启动许多,~20个python脚本。在这些过程中,我们对数据库和网络进行了大量的IO。这是一个节点将大放异彩的地方,因此我想探讨在这里使用节点而不是python的好处。我知道我可以在这里使用twisted异步执行I/o,但我仍然需要每分钟启动这些进程 编辑: 我知道,像这里描述的那样启动流程并不总是理想的。但是在这个系统的架构中,

我认为用例节点的设计是为了在启动时比python的开销小得多。但有人能通过经验或基准来证实这一点吗

我问这个问题的原因是,我正在做一个项目,在这个项目中,我们每分钟都要启动许多,~20个python脚本。在这些过程中,我们对数据库和网络进行了大量的IO。这是一个节点将大放异彩的地方,因此我想探讨在这里使用节点而不是python的好处。我知道我可以在这里使用twisted异步执行I/o,但我仍然需要每分钟启动这些进程

编辑:

我知道,像这里描述的那样启动流程并不总是理想的。但是在这个系统的架构中,这是理想的解决方案。这就是为什么我考虑节点。因为V8仅由事件驱动,所以以20/min的速率调用“node myscript.js”应该无关紧要。调用myscript.js就是一个事件。它只是不再出现在浏览器中。[编辑]完全错误

在开车上班并思考了这一点之后,我想我的问题应该是如何最好地对代码进行基准测试。从那里我可以分析两种设计

更新:


布兰迪兹向我展示了我的错误。执行“node myscript.js”不是事件。最后,节点解释器的启动时间确实比python稍长。然而,这个数字几乎是零。

我觉得你的问题太模糊了。无论如何,如果您想比较启动时间,为什么不只是
时间
?请看一些示例(文件
null.
为空,因为我们仅尝试测量启动时间):

这些初步结果表明,节点的启动速度稍慢。(您关于“调用myscript.js就是事件”的陈述在我看来并不真实,我的怀疑似乎得到了证实。
myscript.js
调用是一个事件,但使用
node myscript.js
调用它会加载整个过程来处理此事件。)

不过,老实说,你的问题含糊不清,让我想知道你是否没有尝试过一段时间——换句话说,看起来你甚至还没有一个问题要解决!当然,我可能是错的,但也许你现在不必担心这个问题(即使我在一分钟内启动了每个口译员的一千个进程——如果你只启动二十个,那么启动口译员可能没有问题。)


无论如何,我的蟒蛇队会提出一些建议。例如:流程完成需要多少时间?如果时间很短,您确实可以考虑使用,这将创建一个用于管理您的需求的流程轮询。即使您希望通过某种shell脚本调用脚本(因为通过Bash脚本调用脚本与通过
多处理
模块调用脚本之间没有太大区别),我打赌Python在生成字节码
.pyc
文件方面具有优势。V8也这么做吗?

我觉得你的问题太模糊了。无论如何,如果您想比较启动时间,为什么不只是
时间
?请看一些示例(文件
null.
为空,因为我们仅尝试测量启动时间):

这些初步结果表明,节点的启动速度稍慢。(您关于“调用myscript.js就是事件”的陈述在我看来并不真实,我的怀疑似乎得到了证实。
myscript.js
调用是一个事件,但使用
node myscript.js
调用它会加载整个过程来处理此事件。)

不过,老实说,你的问题含糊不清,让我想知道你是否没有尝试过一段时间——换句话说,看起来你甚至还没有一个问题要解决!当然,我可能是错的,但也许你现在不必担心这个问题(即使我在一分钟内启动了每个口译员的一千个进程——如果你只启动二十个,那么启动口译员可能没有问题。)


无论如何,我的蟒蛇队会提出一些建议。例如:流程完成需要多少时间?如果时间很短,您确实可以考虑使用,这将创建一个用于管理您的需求的流程轮询。即使您希望通过某种shell脚本调用脚本(因为通过Bash脚本调用脚本与通过
多处理
模块调用脚本之间没有太大区别),我打赌Python在生成字节码
.pyc
文件方面具有优势。V8也可以吗?

如果启动成本占主导地位,那么您可能正在做一些事情。您确定这些必须是独立的过程吗?以20/分钟(1200/小时)的速度启动脚本是一个糟糕的设计。使用
多处理
。启动20名从单个队列获取任务的工作人员。每个工作人员处理一个请求而不启动另一个进程。@S.Lott-值得注意的是,让每个工作人员多次使用意味着你必须更加担心每个工作单元留下的状态。另一种方法是在“基本”级别启动单个进程(即,在运行任何任务代码之前),然后为每个任务提供一个一次性副本。这样,您可以获得更快的“启动时间”,但无需担心每次任务完成后的清理。这在任务为“用户定义”时尤其有用@RHSeeger:“你想使用一个解释器吗?在过去的一天里,有20个你不认识的人在解释器中定义新的类、对象、数据等?”我想。我使用Apache、Python、Django、MySQL和Linux。很多我不认识的人已经创建了很多我相信已经正确设计的软件。@S.Lott:甚至Apache也有一个pre-fork MPM,用于与使用非线程安全库的软件兼容。有些软件需要隔离。一些设计糟糕的软件需要改进
$ i=0
$ time while [ $((i++)) -lt 1000 ] ; do python null.py ; done

real    0m55.777s
user    0m30.154s
sys 0m13.910s

$ i=0
$ time while [ $((i++)) -lt 1000 ] ; do node null.js ; done

real    1m37.618s
user    0m59.578s
sys 0m18.038s