Java和python进程可以独占锁定linux上的相同文件

时间:2012-11-06 09:11:56

标签: java python linux

我有一个java应用程序和一个python启动器。 java应用程序使用此代码锁定文件以避免多次启动:

java.nio.channels.FileLock lock = lockWrapper.getChannel().tryLock();
if (lock == null) {
     logger.info("Anotheris already running");
}
lock.release();
staticLock = lockWrapper.getChannel().lock();

python启动程序试图用fcntl锁定同一个文件,它可以。两个java进程不能这样做,并且两个python进程都不能独占锁定在同一个文件上。但是java和python可以在任何方向上。 我正在使用openjdk 6和python2.7的xubuntu我使用portalocker进行python。

    lockfile =open(lockfilename, 'w+')
    portalocker.lock(lockfile, portalocker.LOCK_EX| portalocker.LOCK_NB)

在win7上也能正常工作。

2 个答案:

答案 0 :(得分:2)

我得到了同事的答案,这很简单。 Java不使用POSIX锁,但是python可以。所以他们不能互操作......


实际上它们可以,但只有当一个人可以强制两个运行时使用相同的锁定机制时。但是这迫使你对它进行硬编码,使代码变得脆弱并且非常依赖于平台。

答案 1 :(得分:1)

这适用于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