5

我有一个 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上也能正常工作。

4

2 回答 2

2

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


实际上他们可以,但前提是可以强制两个运行时使用相同的锁定机制。但这会迫使您对其进行硬编码,从而使代码变得脆弱且非常依赖于平台。

于 2012-11-06T09:26:01.630 回答
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

于 2016-02-11T01:47:50.360 回答