我有一个Java应用程序和一个python启动器。 Java应用程序locking一个文件,以避免使用此代码的多个启动:
java.nio.channels.FileLock lock = lockWrapper.getChannel().tryLock(); if (lock == null) { logger.info("Anotheris already running"); } lock.release(); staticLock = lockWrapper.getChannel().lock();
python启动器试图用fcntllocking同一个文件,它可以。 两个java进程不能做到这一点,两个python进程都不能locking在同一个文件上。 但是,一个Java和一个Python可以在任何方向。 我在一个openjdk 6和python2.7的xubuntu我使用Pythonock的门户网站。
lockfile =open(lockfilename, 'w+') portalocker.lock(lockfile, portalocker.LOCK_EX| portalocker.LOCK_NB)
在win7上也能正常工作。
我从同事那里得到了答案,这很简单。 Java不使用POSIX锁,但Python。 所以他们不能互相操作
事实上,他们可以,但只有当一个人可以迫使两个运行时使用相同的锁定机制。 但是这会迫使你对代码进行硬编码,使得代码变得脆弱而且非常依赖于平台。
这对我在Linux el6上适用。 使用FileLock和Python 2.6的Oracle Java 7可以正确地锁定文件。 编辑:使用F_SETLKW阻塞/等待操作。
Python代码不可移植。 这在我的环境中不是问题。
import fcntl, struct, time f = open("/tmp/TestLock","w") lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0) unlockdata = struct.pack('hhllhh', fcntl.F_UNLCK, 0, 0, 0, 0, 0) while True: try: fcntl.fcntl(f.fileno(),fcntl.F_SETLK, lockdata) print "Lock held" time.sleep(5) except IOError as ex: print "Lock failed: "+ex.strerror if ex.errno == 11: time.sleep(0.5) else: break continue else: fcntl.fcntl(f.fileno(),fcntl.F_SETLK, unlockdata)
参考: https : //docs.python.org/2/library/fcntl.html搜索页面的SVR4(底部)
参考: https : //community.dur.ac.uk/physics.astrolab/file_locking.html