簡體   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