Java和python进程可以在linux上独占锁定同一个文件

2024-09-27 01:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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上。我使用PortalLocker for python。

^{pr2}$

在win7上也能正常工作。在


Tags: 文件代码程序lock应用程序if进程java
2条回答

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


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

这在linuxel6上适用。 使用FileLock和Python2.6的OracleJava7可以正确地锁定文件。 编辑:使用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

相关问题 更多 >

    热门问题