Node.js 到 Python 通信 - 服务器或子进程?
Node.js to Python communication - server or child process?
我目前在做一个主要用Node.js写的项目,涉及到非线性曲线拟合。在尝试使用 Node.js 本身完成此任务后,我放弃了它,因为它根本不切实际。所以我一直在寻找一种高级语言来解决我面临的数学问题。我不得不在 MATLAB 和 Python 之间做出决定,但是由于 Python 现在已经有了非常强大的方法而且它是免费的,所以我决定选择 Python。
现在我需要找到一种在Node.js和Python之间进行通信的方法,我已经找到了两种完全不同的方法:
- 设置 Python 服务器,解决所描述的数学问题 here
- 或者按照 here
所述从我的 node.js 代码生成子进程
现在我通常会使用客户端服务器方法,因为在我看来它更简洁,因为它将两种语言分开。但是既然有人正在写关于第二种方法的博客post,那么它肯定有一些优势,对吧?
有人能简要解释一下在这种情况下这两种方法的优缺点吗?
两种方法各有利弊。
独立服务器
设置服务器更耗时,您需要确保 Python 服务器在 Node 应用程序需要与其对话之前启动,如果它停止等,您必须重新启动它。
另一方面,您有一个很好地分离的服务,可以被其他应用程序使用,如果您需要更高的性能,可以轻松地移动到一个单独的盒子或一组盒子。
生成进程
生成一个进程比 运行 一个单独的服务器要容易得多,你总是知道它在你需要的时候 运行 正在运行。您不必使用启动脚本、重生等来管理单独的服务器。
另一方面,您只能在与您的 Node 程序相同的机器上使用 运行 Python 程序,如果性能有问题,那么您将不得不将其作为一个单独的程序服务器能够 运行 它在不同的机器或一组机器上。
选择
选择实际上取决于您自己对未来使用情况和服务器负载的期望。这两种方法都有效,并且都有不同的优点和缺点。
抽象
无论如何,以模块的形式抽象出该选择可能很有用,这样您的主代码就不需要知道您做出了哪个选择。这将意味着您以后可以改变主意。
制作模块可以很简单,只需将相关代码放在单独的 .js
文件中,然后从主代码中获取该文件即可。该模块可以导出一个或多个接受回调或 return 承诺的函数,只要回调被调用或承诺得到预期的解决,您的主代码就不需要知道引擎盖下发生了什么数据.
我目前在做一个主要用Node.js写的项目,涉及到非线性曲线拟合。在尝试使用 Node.js 本身完成此任务后,我放弃了它,因为它根本不切实际。所以我一直在寻找一种高级语言来解决我面临的数学问题。我不得不在 MATLAB 和 Python 之间做出决定,但是由于 Python 现在已经有了非常强大的方法而且它是免费的,所以我决定选择 Python。
现在我需要找到一种在Node.js和Python之间进行通信的方法,我已经找到了两种完全不同的方法:
- 设置 Python 服务器,解决所描述的数学问题 here
- 或者按照 here 所述从我的 node.js 代码生成子进程
现在我通常会使用客户端服务器方法,因为在我看来它更简洁,因为它将两种语言分开。但是既然有人正在写关于第二种方法的博客post,那么它肯定有一些优势,对吧?
有人能简要解释一下在这种情况下这两种方法的优缺点吗?
两种方法各有利弊。
独立服务器
设置服务器更耗时,您需要确保 Python 服务器在 Node 应用程序需要与其对话之前启动,如果它停止等,您必须重新启动它。
另一方面,您有一个很好地分离的服务,可以被其他应用程序使用,如果您需要更高的性能,可以轻松地移动到一个单独的盒子或一组盒子。
生成进程
生成一个进程比 运行 一个单独的服务器要容易得多,你总是知道它在你需要的时候 运行 正在运行。您不必使用启动脚本、重生等来管理单独的服务器。
另一方面,您只能在与您的 Node 程序相同的机器上使用 运行 Python 程序,如果性能有问题,那么您将不得不将其作为一个单独的程序服务器能够 运行 它在不同的机器或一组机器上。
选择
选择实际上取决于您自己对未来使用情况和服务器负载的期望。这两种方法都有效,并且都有不同的优点和缺点。
抽象
无论如何,以模块的形式抽象出该选择可能很有用,这样您的主代码就不需要知道您做出了哪个选择。这将意味着您以后可以改变主意。
制作模块可以很简单,只需将相关代码放在单独的 .js
文件中,然后从主代码中获取该文件即可。该模块可以导出一个或多个接受回调或 return 承诺的函数,只要回调被调用或承诺得到预期的解决,您的主代码就不需要知道引擎盖下发生了什么数据.