我有写在Java上的代码,将所有数据写入文件,然后我有处理这些数据的Python脚本。如何访问不同访问器之间共享的文件?
它们完全分开运行,python脚本可以按计划运行,但它也从文件中删除处理过的记录。 问题是在实现访问文件时,第一个进程的java代码将尝试写入某些内容,第二个进程的python代码将尝试删除已处理的记录?
首先想到的是,当有过程的一个更新文件,但也许还有一些其他的解决方案,以考虑物理创建.lock文件?
谢谢。
我有写在Java上的代码,将所有数据写入文件,然后我有处理这些数据的Python脚本。如何访问不同访问器之间共享的文件?
它们完全分开运行,python脚本可以按计划运行,但它也从文件中删除处理过的记录。 问题是在实现访问文件时,第一个进程的java代码将尝试写入某些内容,第二个进程的python代码将尝试删除已处理的记录?
首先想到的是,当有过程的一个更新文件,但也许还有一些其他的解决方案,以考虑物理创建.lock文件?
谢谢。
一种机制是让生产者每隔一段时间将文件滚动到一个新名称(可能后缀为HHMMSS
),让消费者在文件被滚动到新名称后才处理文件。也许每隔5分钟?
另一种机制是有消费卷文件本身,并有生产商的通知,该文件已经推出,并重新打开原始文件名。所以消费者总是从output.consume
消费,生产者总是写信给output
什么的。
output
存在。output
或output.consume
东西。output
不再存在,所以他重新打开它输出。output
文件是重新创建消费者可以处理output.comsume
文件。确保Java和Python方法关闭文件当他们完成。
一种可能性是将您的Python脚本转换为Jython。如果两个进程都在JVM中运行,那么您应该能够使用标准的Java并发技术来确保您没有两个线程同时修改文件。
最好的办法可能是放弃使用文件并使用套接字。 Java程序生成并缓存输出,直到Python脚本正在侦听。 Python脚本然后接受数据并处理它。
或者,你可以使用两个进程之间的IPC的信号,虽然这似乎是一个很多比插座,恕我直言,比较杂乱。
否则,.lock文件似乎是您最好的选择。
在这种情况下,消息可能比套接字更健壮。 – 2013-03-26 16:57:43
@BurhanKhalid:那肯定是对的,并且可以让你通知另一个进程发生了错误。好的一点。 – jedwards 2013-03-26 17:01:26