Java - Python共享内存通信

时间:2017-04-29 15:58:42

标签: java python ipc speedus

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

  1. Java 做了一些工作,并将一个长度为100,000的int数组激发到......
  2. Python ,它可以完成一些工作,并将一个长度为100,000的新数组发送回...
  3. Java ,做了一些工作......等等。
  4. 请注意

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

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

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

2 个答案:

答案 0 :(得分:1)

寻找快速中介数据服务器以协助它们之间的通信。 Redis会做的伎俩。你需要两个数据结构:

  1. 一个列表(您的100,000个项目列表)。我们将my_project:list称为参考。
  2. 锁。这可以是Redis字符串设置为" Python"或" Java。"
  3. 然后进行以下互动:

    1. Python和Java都会轮询Redis锁定。如果它等于" Python"那么它就是Python的转折点。如果" Java,"这是Java的转折。
    2. 无论哪个程序转入工作模式并执行my_project:list所需的任何操作,它都会锁定其他程序。
    3. 无限期重复。<​​/ li>

答案 1 :(得分:1)

您可以尝试使用jep在同一进程中组合java和python。最新版本使用sharing memory和java numpy ndarrays在python和java之间添加了对direct buffers的支持。这样就可以在不进行任何复制的情况下共享数据,从而提供最佳性能。