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 を使用して同じファイルをロックしようとしますが、ロックできます。2 つの Java プロセスがこれを行うことはできず、2 つの Python プロセスが同じファイルを排他的にロックすることもできません。しかし、java と python は、どの方向でも可能です。私はopenjdk 6とpython2.7を備えたxubuntuを使用しています。pythonにはportallockerを使用しています。

    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 に答える