티스토리 뷰
Semaphore
-> 상호배제를 하면서 동시에 수행할 수 있는 스레드의 개수를 설정할 수 있는 클래스
-> 생성자를 이용해서 동시 수행가능한 개수를 설정
-> 스레드가 수행되는 시점에 acquire()를 호출하고 스레드가 종료되는 시점에 release()를 호출.
-> 한정된 자원을 여러 개의 프로세스들이 사용해야 할 경우, 프로세스들 간에 자원 사용 시 충돌이 없도록 하기 위해서 세마포어를 사용
acquire() : 리소스를 확보하는 메서드. (사용할 때 P연산)
release() : 리소스를 해제하는 메서드 (반환할 때 S연산)
acquire를 하면 알아서 자기가 wait를 함.
acquire() : 리소스를 확보하는 메서드 리소스에 빈자리가 생겼을 경우 바로 스레드가 acquire 메서드로부터 곧바로 돌아오게 되고
세마포어 내부에서는 리소스의 수가 하나 감소하며 리소스에 빈자리가 없을 경우 쓰레드는 acquire 메서드 내부에서 블록된다.
release() : 리소스를 해제하는 메서드로 세마포어 내부에서는 리소스가 하나 증가하며 acquire 메서드 안에서 대기중인
스레드가 있으면 그 중 한 개가 깨어나 acquire 메서드로부터 돌아올 수 있다.
'''
from threading import BoundedSemaphore, Lock, Thread
from random import randrange
from time import sleep, ctime
from atexit import register
lock = Lock()
MAX = 5
candytray = BoundedSemaphore(MAX)
def refill():
lock.acquire()
print('Refilling candy...')
try:
candytray.release()
except ValueError:
print('full, skiping')
else:
print('OK')
lock.release()
def buy():
lock.acquire()
print('Buying candy...')
if candytray.acquire(False):
print('OK')
else:
print('empty, skiping')
lock.release()
def producer(loops):
for i in range(loops):
refill()
sleep(randrange(3))
def consumer(loops):
for i in range(loops):
buy()
sleep(randrange(3))
def _main():
print('starting at:', ctime())
nloops = randrange(2, 6)
print('The candy machine (full with %d bars)!'%MAX)
Thread(target=consumer, args=(randrange(nloops, nloops + MAX + 2),)).start()
Thread(target=producer, args=(nloops,)).start()
@register
def _atexit():
print('all done at : ', ctime())
if __name__ == '__main__':
_main()
'공부 > Python' 카테고리의 다른 글
print() 함수에 서식 적용하기 (0) | 2016.12.15 |
---|---|
Python Closure 함수 (0) | 2016.12.15 |
HTML 파싱 라이브러리 BeautifulSoup (0) | 2016.12.15 |
PyQt (0) | 2016.12.15 |
Numpy, Scipy, Pandas, Matplotlib 설치 (0) | 2016.11.28 |