[英]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.