python2.7で「ファイルの排他ロックをする方法」について知識のある方、
教えていただければ助かります。よろしくおねがいします。
前提・実現したいこと
pythonでファイル削除処理(os.remove)に対して排他ロックをかける方法を知りたい。
2つのpythonスクリプトを使用して、
1つのテキストファイル(locktest.txt)に対して排他ロックをかけ、
書き込み→ファイル削除を行いたいです。
発生している問題・エラーメッセージ
os.remove("/filepath")に排他ロックをかける方法がわからない。
使用するスクリプトは下記の3つです。
①writeするためのpythonスクリプト(書き込み中は排他ロックを20秒ほどかける設定、正常動作している)
②Deleteするためのpythonスクリプト(ここがわからないポイント)
③write,deleteされる対象のテキストファイル(locktest.txt)
③に対し、①でwriteする際に排他ロックをかけているのですが、
①を実行している最中に②のファイル削除を実行すると、排他が効かず③が削除されてしまいます。
そのため、①のアンロック時に③がみつからず、
下記のようなエラーが発生します。
$ python aaa_write_first.py ロックを獲得できるまで待ちます ロックを獲得できました ------------------ ロックを獲得できた時の処理をここに書きます 例えば、ここでは 20秒間スリープします Traceback (most recent call last): File "aaa_write_first.py", line 24, in <module> main() File "aaa_write_first.py", line 20, in main fcntl.flock(f.fileno(), fcntl.LOCK_UN) ValueError: I/O operation on closed file
該当のソースコード
↓①write用ファイル(書き込み後、20秒排他ロック)
python
1# -*- coding: utf-8 -*- 2 3import fcntl 4 5def main(): 6 fname = '/home/foo/bar/locktest.txt' 7 8 try: 9 with open(fname, "w") as f: 10 print('ロックを獲得できるまで待ちます') 11 fcntl.flock(f.fileno(), fcntl.LOCK_EX) 12 print('ロックを獲得できました') 13 f.write('first' * 500) 14 print('------------------') 15 print('ロックを獲得できた時の処理をここに書きます') 16 print('例えば、ここでは 20秒間スリープします') 17 import time 18 time.sleep(20) 19 finally: 20 fcntl.flock(f.fileno(), fcntl.LOCK_UN)
↓①delete用ファイル(①のwriteファイル実行中に実行するためもの)
こちらのos.removeプロセスに排他ロックをかける方法がわからず、知識のある方に教えていただきたいです。
python
1# -*- coding: utf-8 -*- 2 3import fcntl 4 5def main(): 6 fname = '/home/foo/bar/locktest.txt' 7 8 try: 9 print('ファイル削除を開始します') 10 import os 11 os.remove(fname) 12 # writeと同じように排他ロックをかけようとするとエラーになる 13 # fcntl.flock(os.remove(fname.fileno()), fcntl.LOCK_EX) 14 print('ファイル削除を完了しました') 15 except Exception as e: 16 print(e) 17 finally: 18 pass
試したこと
ファイル削除処理に排他ロックをかけるために、fcntlライブラリのflockメソッドを使用したがエラーになった。
python
1fcntl.flock(os.remove(fname.fileno()), fcntl.LOCK_EX) 2 3>>出力結果 4'str' object has no attribute 'fileno' 5
補足情報
python2.7
知識のある方、教えていただければ助かります。よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/26 02:28
2019/06/26 02:32
2019/06/26 02:54
2019/06/26 03:04
2019/06/26 03:14
2019/06/26 04:15
2019/06/26 05:19
2019/06/27 01:09