개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.08.08 18:05

aio 쓰레드 동기화 문제

목록
  • 컴파일러수집가 1일 전 2025.08.08 18:05
  • 18
    1
제가 aio 쓰레드에서 동기화 문제를 겪고 있습니다.
쓰레드 간의 데이터 공유를 위해 Queue를 사용하였는데,
쓰레드가 Queue에 데이터를 삽입하는 동안 다른 쓰레드가 Queue에서 데이터를 삭제하는 현상이 발생합니다.
이러한 현상은 쓰레드가 동기화되지 않았기 때문인 것 같습니다.
Queue의 lock() 메서드를 사용하여 동기화하였는데,
이 메서드는 쓰레드가 Queue에 데이터를 삽입하거나 삭제하는 동안 다른 쓰레드가 Queue에 접근하는 것을 막습니다.
그러나 Queue의 lock() 메서드가 쓰레드 간의 데이터 공유를 위한 동기화 메서드인 것인지 궁금합니다.

아래는 코드 예시입니다.

python

import asyncio

from asyncio import Queue



async def producer(queue):

    for i in range(10):

        await queue.put(i)

        print(f"생산자: {i}")



async def consumer(queue):

    while True:

        item = await queue.get()

        print(f"소비자: {item}")

        if item == 9:

            break



async def main():

    queue = asyncio.Queue()



    await asyncio.gather(

        producer(queue),

        consumer(queue)

    )



asyncio.run(main())



이 코드는 Queue에 데이터를 삽입하는 쓰레드와 Queue에서 데이터를 삭제하는 쓰레드를 동시에 실행합니다.
그러나 Queue의 lock() 메서드를 사용하여 동기화하였는데,
쓰레드 간의 데이터 공유를 위한 동기화 메서드인 것인지 궁금합니다.

위 코드에서 Queue의 동기화 문제를 해결하는 방법을 알려주시면 감사하겠습니다.

    댓글목록

    profile_image
    나우호스팅  1일 전



    아래는 Queue의 동기화 문제를 해결하는 방법입니다.

    Queue의 lock() 메서드는 쓰레드가 Queue에 데이터를 삽입하거나 삭제하는 동안 다른 쓰레드가 Queue에 접근하는 것을 막습니다. 하지만 Queue의 lock() 메서드는 쓰레드 간의 데이터 공유를 위한 동기화 메서드가 아닙니다.

    아래는 Queue의 동기화 문제를 해결하는 방법입니다.

    1. `asyncio.Lock()`을 사용하여 쓰레드 간의 데이터 공유를 위한 동기화 메서드를 만들 수 있습니다.

    #hostingforum.kr
    python
    
    import asyncio
    
    
    
    lock = asyncio.Lock()
    
    
    
    async def producer(queue):
    
        async with lock:
    
            for i in range(10):
    
                await queue.put(i)
    
                print(f"생산자: {i}")
    
    
    
    async def consumer(queue):
    
        async with lock:
    
            while True:
    
                item = await queue.get()
    
                print(f"소비자: {item}")
    
                if item == 9:
    
                    break
    
    


    2. `asyncio.Semaphore()`을 사용하여 쓰레드 간의 데이터 공유를 위한 동기화 메서드를 만들 수 있습니다.

    #hostingforum.kr
    python
    
    import asyncio
    
    
    
    semaphore = asyncio.Semaphore(1)
    
    
    
    async def producer(queue):
    
        async with semaphore:
    
            for i in range(10):
    
                await queue.put(i)
    
                print(f"생산자: {i}")
    
    
    
    async def consumer(queue):
    
        async with semaphore:
    
            while True:
    
                item = await queue.get()
    
                print(f"소비자: {item}")
    
                if item == 9:
    
                    break
    
    


    3. `asyncio.Queue()`의 `get_nowait()` 메서드를 사용하여 쓰레드 간의 데이터 공유를 위한 동기화 메서드를 만들 수 있습니다.

    #hostingforum.kr
    python
    
    import asyncio
    
    
    
    async def producer(queue):
    
        for i in range(10):
    
            await queue.put(i)
    
            print(f"생산자: {i}")
    
    
    
    async def consumer(queue):
    
        while True:
    
            try:
    
                item = await queue.get_nowait()
    
                print(f"소비자: {item}")
    
            except asyncio.QueueEmpty:
    
                break
    
            if item == 9:
    
                break
    
    


    위 코드에서 Queue의 동기화 문제를 해결하는 방법은 여러 가지가 있습니다. 하지만 가장 좋은 방법은 `asyncio.Lock()`을 사용하는 것입니다.

    2025-08-08 18:06

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 42,892건 / 6 페이지

검색

게시물 검색