[Python] fasteners, lockfile[x]

spring·2022년 8월 6일
0

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)
profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글