반응형

하나의 스레드에서 큐에 데이터를 넣고 다른 쓰레드에서 큐에서 데이터를 꺼내는 간단한 예제 코드입니다. 

아래 링크를 참고했습니다. 

 

https://docs.python.org/3/library/queue.html 



2022. 09. 03  최초작성

2023. 01. 21  큐 모듈 변경.




import threading
from multiprocessing import Queue


def producer():

    count = 0
    while True:

        lock.acquire() # 전역 변수 접근을 금지합니다.

        if not q.full(): # 큐가 꽉차지 않았다면

            count = count +1
            q.put_nowait(count) # 큐에 데이터를 넣습니다.
            print(f'push item {count}')
         

        lock.release() # 이제 전역 변수 접근을 할 수 있습니다.

        if count == 10: break

    print('thread 1 exit')


def consumer():

    while True:

        # acquire 대신에 with를 사용하면 release를 적을 필요가 없습니다.
        with lock:  # 전역 변수 접근을 금지합니다.

            if not q.empty(): # 큐가 비어있지 않다면
                item = q.get_nowait() # 큐에서 데이터를 꺼냅니다.
                print(f'get item {item}')

            if item == 10: break

    print('thread 2 exit')



# 큐의 최대 크기는 3입니다.
q = Queue(3)

lock = threading.Lock()  # 뮤텍스 객체를 전역으로 선언하여 스레드간에 공유하도록 합니다.


t1 = threading.Thread(target=producer) # 큐에 데이터를 넣는 스레드입니다.
t1.start()

t2 = threading.Thread(target=consumer) # 큐에서 데이터를 꺼내는 스레드입니다.
t2.start()

# 스레드가 종료하기를 대기합니다.
t1.join()
t2.join()


print('main exit')





실행 결과입니다. 

 

한 스레드에서 데이터를 큐에 넣고(push item) 다른 스레드에서 큐에서 데이터를 꺼내고(get item) 있습니다. 아래 결과에선 큐에 넣고 큐에서 꺼내는게 데이터 3개씩 번갈아 가면 발생하지만 스레드라서 이렇게 동작하지 않을 수도 있습니다.  

 

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts