2017-11-06 12 views
2

1つのpythonプロセスがディレクトリを処理していることを確認する方法が必要です。Linux IPC:ロックします(ファイルベースのロックはありません)。

ロック/セマフォは、ローカルマシン(Linuxオペレーティングシステム)である必要があります。

ネットワークまたはNFSは関係しません。

私はロックファイルをどこに置くべきかわからないので、ファイルベースのロックを避けたいと思います。

pypiにposix IPCを提供するライブラリがあります。

第三者のライブラリなしでPythonでLinuxセマフォを使用する方法はありませんか?

両方のPythonインタプリタが同じ親を共有しないので、multiprocessing.Lockによって提供されるロックは役に立ちません。

スレッディングは関係しません。すべてのプロセスにはスレッドが1つしかありません。

私はLinuxでPython 2.7を使用しています。

(ファイルベースのロックなしで)Linux上で2つのpythonスクリプトを同期する方法は?

必要な機能:1つのプロセスが終了すると、オペレーティングシステムによってロック/セマフォが解放されます。

+0

これはのhttps://stackoverflow.com/a/37303133/2836621 –

+0

創造を助けるかもしれませんディレクトリはアトミックなので、処理したいディレクトリに '.in_use'という隠しディレクトリを作成して作成することができます。成功すれば他の誰もそれを解除してロックを解除するまで成功することはできません.... –

+0

@MarkSetchell私は、プログラミング言語pythonのためのソリューションを探しています。 – guettli

答えて

2

群れディレクトリ自体 - あなたがロックファイルを置く場所を心配必要はありません:

import errno 
import fcntl 
import os 
import sys 

# This will work on Linux 

dirfd = os.open(THE_DIRECTORY, os.O_RDONLY)   # FIXME: FD_CLOEXEC 
try: 
    fcntl.flock(dirfd, fcntl.LOCK_EX|fcntl.LOCK_NB) 
except IOError as ex: 
    if ex.errno != errno.EAGAIN: 
    raise 
    print "Somebody else is working here; quitting." # FIXME: logging 
    sys.exit(1) 

do_the_work() 
os.close(dirfd) 
+0

この場合、私はディレクトリを持っているので、これは今度はうまくいきます。私は興味があります...ディレクトリなしでロックを行う方法はありませんか? – guettli

+0

はい、完全に動作します。ありがとうございました – guettli

0

私はロックファイルをどこに置くべきかわからないので、ファイルベースのロックを避けたいと思います。

既存のファイルまたはディレクトリ(処理中のファイル)をロックできます。

必要な機能:1つのプロセスが終了すると、オペレーティングシステムによってロック/セマフォが解放されます。

これは、ファイルロックがどのように機能するかを示しています。

関連する問題