4

我们有一个 Java 程序和一个 Python 程序,需要让它们以乒乓的方式组合在一起,每次交换一个长度为 100,000 的整数数组,并花费 ~ 0.1 - 1 秒来完成它们的工作:

  1. Java做了一些工作并触发了一个长度为 100,000 的 int 数组...
  2. Python,它做了一些工作并将一个长度为 100,000 的新数组返回到...
  3. Java,它做了一些工作......等等

注意

  • 每个程序都需要等待另一个程序完成它的一部分。
  • 它们将在同一台 Linux 机器上运行。
  • 我们将进行蒙特卡罗模拟,所以速度很重要。

我更熟悉 Java,并且了解共享内存支持文件方法可能是最快的。 似乎与 Java 方面有关,但是我如何让每个程序等待/阻止另一个程序完成其工作并在另一个程序开始读取之前更新共享内存?我听说过一种叫做“信号量”的东西,但无法弄清楚。

这些是我的后备想法,但也许它们更好?

4

2 回答 2

1

您可以尝试使用jep在同一进程中组合 java 和 python 。最新版本增加了对使用numpy ndarrays和 java direct buffers在 python 和 java 之间共享内存的支持。这将使您无需任何复制即可共享数据,这应该可以提供最佳性能。

于 2017-08-18T19:44:17.307 回答
1

寻求快速的中间数据服务器来协助它们之间的通信。Redis 可以解决问题。你需要两个数据结构:

  1. 列表(您的 100,000 项列表)。我们将其称为my_project:list参考。
  2. 一把锁。这可以只是一个设置为“Python”或“Java”的 Redis 字符串。

然后进行如下交互:

  1. Python 和 Java 都轮询 Redis 锁。如果它等于“Python”,则轮到 Python。如果是“Java”,那就轮到 Java 了。
  2. 无论哪个程序轮到它进入工作模式并执行它需要做的任何事情my_project:list,然后它将锁定设置为轮到另一个程序。
  3. 无限重复。
于 2017-04-29T17:00:42.740 回答