lockfile
모듈은 deprecated 되었다.
이 모듈의 가장 큰 문제는 지정한 파일에 대해 lock을 걸고 프로세스가 죽어버리면 다음번에 해당 파일에 접근이 아예 불가능하다.
무한대기를 하게 되는 현상이 발생한다.
lockfile
모듈은 내부적으로 lock 동작 수행시 filename.txt.lock
과 같은 파일을 만들어서 lock/unlock을 관리한다.
이를 대체할 모듈이 fasteners
이다.
아래와 같이 사용한다.
import fasteners
filename = 'c.txt'
lock = fasteners.InterProcessLock(filename + '.lock')
lock.acquire()
with open(filename, 'a', encoding='utf-8') as f:
f.write('hello, world\n')
lock.release()
잠그고 싶은 파일이름 + .lock으로 크리티컬섹션을 만드는 방법으로 사용한다.
간단하게 테스트해보니 스레드와 프로세스에서 모두 크리티컬 섹션을 잘 유지하는 것 같다.
import lockfile
import fasteners
import sys
from concurrent.futures import ProcessPoolExecutor
import time
def write_file(message):
try:
filename = 'c.txt'
lock = fasteners.InterProcessLock(filename + '.lock')
with lock:
with open(filename, 'a', encoding='utf-8') as f:
f.write('hello, world\n')
except:
return False
return True
def process_threading(messages):
start = time.time()
with ProcessPoolExecutor(max_workers=len(messages)) as pool:
result = list(pool.map(write_file, messages))
print(result)
end = time.time()
print(f'>>> 스레딩 처리 총 소요 시간: {end - start}')
import random
if __name__ == '__main__':
# filename = 'c.txt'
# lock = fasteners.InterProcessLock(filename + '.lock')
# lock.acquire()
# with open(filename, 'w', encoding='utf-8') as f:
# f.write('hello, world\n')
# lock.release()
# process_threading([i for i in range(20)])
print(300)
for j in range(150):
print(300, end=' ')
size = random.randint(1, 300)
for i in range(1, size):
print(i, end=' ')
print('')
for j in range(150):
print(0)