不同语言程序间共享变量的事实标准是什么?
我没有接受过正式的培训,所以我想知道学校里会教些什么(如果有的话)。假设你有两个用不同编程语言写的程序:C++和Python,或者其他组合,你想在同一台机器上共享一个不断更新的变量,你会用什么方法,为什么?这个信息不需要特别安全,但必须是可靠的。
比如,程序A会从一个硬件设备获取一个值,并每0.1毫秒更新一次变量X。我希望能够尽可能频繁地从程序B访问这个X,并获取最新的值。程序A和B是用两种不同的(稳定的)语言编写和编译的。我该如何从程序B访问X?假设我有A和B的源代码,并且我不想完全重写或移植其中任何一个。
到目前为止,我看到的一些方法包括:
- 文件缓冲 - 读写一个单一的文件(例如C:\temp.txt)。
- 创建一个包装器 - 从A到B或从B到A。
- 内存缓冲 - 指定一个特定的内存地址(互斥锁?)。
- 通过套接字发送UDP数据包 - 我还没试过,但看起来不错。防火墙呢?
抱歉我只是随便抛出这个问题,我不知道这个技术的名字,所以我搜索起来有点困难。
5 个回答
你可以写一些XML格式的文件,然后用一些简单的消息队列工具(比如rabbitMQ)来传递消息。
不知道这是否有帮助,但我也是个学生,我觉得你想表达的是这个。
我用过“数据传输”这个方法,把一个Java类导入到C#程序里。
通过数据传输,你可以使用XML格式来传递代码,这样其他编程环境也能读取这些代码。
在提问时,尽量提供尽可能多的信息。你已经添加了一个使用案例,但这个案例还不够完整。
你的使用案例看起来是需要在高频率(10kHz)下处理一小部分数据。我建议你先确定一下,能否把这两段代码放在同一个进程里,而不是分开成两个不同的进程。根据使用的编程语言(问题中没有提到),这可能会很简单,或者让原本不可能的事情变得可能。根据操作系统(问题中没有提到)的不同,调度程序可能在进程之间切换时速度不够快,这可能会影响到你获取到的最新数据。线程之间的切换通常要快得多。
如果你不能把它们合并成一个进程,那就需要用某种方式进行进程间通信(IPC)。考虑到频率,我建议避免使用大多数重量级的协议(比如XML、CORBA),因为它们的开销可能太大。如果接收端只需要访问最新的值,而且访问的频率可能低于0.1毫秒,那么你就不想使用任何包含排队的协议,因为你只关心最后一个值。如果你没有在数据好的时候读取它,就避免处理已经过时的数据——也就是说,不需要不断从队列中提取并丢弃。
我倾向于使用共享内存,或者内存映射的共享文件(这两者可能很相似,具体取决于平台 问题中没有提到)。根据元素的大小和具体的硬件架构(问题中没有提到),你可能可以避免使用互斥锁来进行锁定。举个例子,在当前的英特尔处理器中,如果变量对齐正确,从内存中读取/写入32位整数是保证原子的,所以在这种情况下你就不需要上锁。