파이썬(Python) Thread - 데이터 전달 설명
지난 시간에 이어서 오늘은 파이썬 쓰레드 동기화 및 데이터 전달에 대해서 간단하게 설명하겠습니다.
쓰레드 작업에서 메시지 전달 기능 추가는 각 쓰레드 간에 동기화 작업을 정확하게 구현해줘야
한다고 생각합니다.
아래 예제에서는 파이썬 Queue(큐)를 사용해서 쓰레드간 데이터 전달 과정을 구현해 보았습니다.
문서 하단에서 간단하게 예제를 작성해보겠습니다.
Python 관련 포스팅 : Python 관련
Python 관련 포스팅 : Python 관련
파이썬(Python) Thread - 구조
보통 Thread는 아래와 아키텍처로 나타낼 수 있으며, 관련 예제는 하단에서 설명합니다.
Thread 구조 - 출처
파이썬(Python) Thread 동기화 및 데이터 전달 - 예제 코드
파이썬 큐(Queue)를 이용한 쓰레드 동기화를 구현한 예제 소스 입니다.
Threading-comm.py
1234567891011121314151617181920212223242526272829303132333435363738394041 import threading from queue import Queue def creator(data, q): """ 생산자 : 쓰레드간 데이터 전송 예제 """ print('Creating data and putting it on the queue') print('\n') for item in data: evt = threading.Event() q.put((item, evt)) print('Waiting for data to be doubled') evt.wait() def consumer(q): """ 소비자 : 쓰레드간 데이터 전송 예제 """ while True: data, evt = q.get() print('Receive Original Data : {}'.format(data)) processed = data * 5 print('Receive Processed Data : {}'.format(processed)) print('\n') evt.set() q.task_done() if __name__ == '__main__': q = Queue() data = [7, 14, 39, 59, 77, 1, 109, 99, 167, 920, 1035] thread_one = threading.Thread(target=creator, args=(data, q)) thread_two = threading.Thread(target=consumer, args=(q,)) thread_one.start() thread_two.start() q.join() cs
- 6번 라인 : 생산자(Creator) 함수 선언
- 13번 라인 : threading에서 Event객체 수신- 14번 라인 : queue에 item과 event 객체를 담는다.- 16번 라인 : 쓰레드간 동기화를 위해서 wait() 메소드 호출을 통해서 대기- 19번 라인 : 소비자(Consumer) 함수 선언- 24번 라인 : queue에서 데이터를 얻어온다.- 29번 라인 : set() 메소드 호출을 통해서 19번라인에서 대기(wait) 중인 쓰레드가 다시 작업 시작
- 34번 라인 : Queue 선언- 38번 라인 : 생산자(Creator) 쓰레드 시작- 39번 라인 : 소비자(Consumer) 쓰레드 시작
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 32 33 34 35 36 37 38 39 40 41 | import threading from queue import Queue def creator(data, q): """ 생산자 : 쓰레드간 데이터 전송 예제 """ print('Creating data and putting it on the queue') print('\n') for item in data: evt = threading.Event() q.put((item, evt)) print('Waiting for data to be doubled') evt.wait() def consumer(q): """ 소비자 : 쓰레드간 데이터 전송 예제 """ while True: data, evt = q.get() print('Receive Original Data : {}'.format(data)) processed = data * 5 print('Receive Processed Data : {}'.format(processed)) print('\n') evt.set() q.task_done() if __name__ == '__main__': q = Queue() data = [7, 14, 39, 59, 77, 1, 109, 99, 167, 920, 1035] thread_one = threading.Thread(target=creator, args=(data, q)) thread_two = threading.Thread(target=consumer, args=(q,)) thread_one.start() thread_two.start() q.join() | cs |
- 13번 라인 : threading에서 Event객체 수신
- 34번 라인 : Queue 선언
Python Thread 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
Python Thread 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) Thread 동기화 및 데이터 전달 - 예제 실행 화면
아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
이번 포스팅에서는 파이썬 큐를 활용해서 쓰레드간 데이터 전달 과정을 구현하는 방법을 간단하게
설명했습니다.
큐를 활용한 동시성 프로그래밍을 통해서 쓰레드를 더욱 안전하고 읽기 좋은 코드로 사용해봤으며,
해당 큐 패턴은 모든 접근을 효과적으로 허용하고 다루기 쉽기 때문에 많이 사용하고 있습니다.
다음 시간에는 파이썬 쓰레드 타이머(Timer)에 대해서 포스팅 하겠습니다.
소스코드 다운로드 : python_thread(3).zip
'언어 > Python' 카테고리의 다른 글
파이썬(Python) - multiprocessing(멀티프로세싱) 설명 및 예제(1) - Pool (4) | 2018.05.31 |
---|---|
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(4) - 일정 주기 반복 실행 (2) | 2018.05.25 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(2) - 동기화 (0) | 2018.05.09 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(1) - 기초 (1) | 2018.05.06 |
파이썬(Python) - 제네레이터(Generator) 설명 및 예제 소스 코드 (0) | 2018.05.04 |