티스토리 뷰

공부/Python

Python Semaphore(Thread)

Bism 2016. 12. 15. 17:14

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함