我们有一个 Java 程序和一个 Python 程序,需要让它们以乒乓方式组合在一起,每次交换一个长度为 100,000 的整数数组,并花费大约 0.1 - 1 秒来完成它们的工作:
- Java 做一些工作并触发一个长度为 100,000 的 int 数组到 ...
- Python,它会做一些工作并将长度为 100,000 的新数组返回给 ...
- Java,做一些工作...等等
注意
- 每个程序都需要等待另一个程序完成它的一部分。
- 它们将在同一台 Linux 机器上运行。
- 我们将进行蒙特卡罗模拟,因此速度很重要。
我更熟悉 Java,并且知道共享内存支持的文件方法可能是最快的。 This似乎与 Java 方面相关,但我如何让每个程序等待/阻止另一个程序完成其工作并在另一个程序开始读取之前更新共享内存?我听说过一种叫做“信号量”的东西,但想不通。
这些是我的后备想法,但也许它们更好?
- Unix 域套接字 jnr-unixsocket
- Sockets与 Speedus
最佳答案
寻找一个快速的中间数据服务器来协助它们之间的通信。 Redis 可以解决问题。你需要两个数据结构:
- 列表(您的 100,000 项列表)。我们将其称为
my_project:list
以供引用。 - 一把锁。这可以只是设置为“Python”或“Java”的 Redis 字符串。
然后进行如下交互:
- Python 和 Java 都轮询 Redis 锁。如果等于“Python”,则轮到 Python。如果是“Java”,则轮到 Java。
- 轮到哪个程序进入工作模式并对
my_project:list
执行任何需要的操作,然后将锁定设置为轮到另一个程序。 - 无限期地重复。
关于Java - Python 共享内存通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697708/