2

我有一个用 Octave 编写的非常复杂的计算代码和一个接收用户输入的 python 脚本,需要根据用户输入运行 Octave 代码。如我所见,我有以下选择:

  1. 将 Octave 代码移植到 python。
  2. 使用外部库(即 oct2py),使您能够从 python 运行 Octave/Matlab 引擎。
  3. 在 python 进程和 octave 进程之间进行通信。一种这样的可能性是使用 python 代码中的 subprocess 并等待答案。

由于我非常不愿意将我的代码移植到 python 并且我不想依赖于 oct2py 等外部库的维护,我支持选项 3。但是,由于系统应该可以很好地扩展,我不想为每个请求生成一个新的 octave 进程,并且任务队列系统似乎更合理。是否有任何(推荐的)任务队列系统可以在 python 中将任务排入队列并在另一端进程中有一个 octave 工作者?

4

2 回答 2

2

这里描述的方式,选项 3 退化为选项 2,因为 Octave 没有明显的方式(API 或包)让“Octave worker”连接到任务队列。

Octave 进行“网络”的唯一方式是通过sockets 包,这意味着从头开始实现与任务队列通信的协议(在 Octave 中)。

拥有“Octave worker”的最初动机是让 Octave 的主进程启动一次,然后“指导”它执行函数并返回结果,而不是在每次调用函数时启动 Octave 的主进程。

由于 Octave 不能开箱即用地执行“工作人员”(启动、侦听“通道”并执行代码),实现这一点的唯一其他方法是让任务队列框架全部在 Python 中工作,并且仅在以下情况下调用 Octave你需要它的功能,很可能是通过oct2py(即选项2)。

有许多不同的方法可以做到这一点,从RedisPyPubSubCeleryRabbitMQ。所有这些都简单明了,并且有据可查。PyPubSub 不需要任何额外的组件。

(就像一个注释:拥有一个“可执行”八度脚本的解决方案,通过 Python 调用它并阻塞直到它返回并不像听起来那么糟糕,但是对于一些并行处理框架,它是拥有多个副本的唯一方法相同的 Octave 脚本对不同的数据段进行操作。)

于 2015-12-06T10:22:29.997 回答
0

根据您的具体情况,所有三个选项都是合理的。

我不想依赖oct2py等外部库的维护,我赞成选项3

oct2py是使用选项 3 实现的。您可以重新发明它已经做的事情或直接使用它。oct2py是纯 Python 并且它具有许可许可证:如果它的开发明天停止;你可以在你的旁边包含它的代码。

于 2015-12-06T11:12:55.050 回答