繁体   English   中英

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

[英]Java and python processes can exclusive lock the same file on 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上也可以正常工作。

我得到了同事的答案,而且非常简单。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM