celery : Python 동시성 프로그래밍에서 가장 많이 사용한는 방법 중 하나이며, 분산 메시지 전달을 기반으로 동작하는 비동기 작업 큐이다.
결국 Celery는 메시지를 전달하는 역할(Publisher)과 메시지를 Message Broker에서 가져와 작업을 수행하는 Worker의 역할을 담당하게 된다.
여기서 잠깐!
동시성 프로그래밍 이란? : 논리적인 용어로 동시에 실행되는 것처럼 보이는것을 말합니다. 싱글코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 스레드를 번갈아 가면서 실행되는 방식입니다.
병렬성 프로그래밍 이란? : 물리적으로 정확히 동시에 실행되는 것을 말합니다. 멀티 코어에서 멀티 스레드를 실행시키는 방식으로 데이터 병렬성과 작업 병렬성으로 나뉩니다.
동시성 vs 병렬성
동시성 : 은행직원 A가 윗사람과 아랫사람을 각각 처리하지만 너무 빠르게 처리하여 동시에 두사람을 처리하는 것처럼 보임
병렬성 : 은행직원 A가 윗사람 은행직원 B가 아랫사람을 각각 동시에 처리한다.
비동기 프로그래밍 이란? : 프로그램의 주 실행 흐름을 멈추어서 기다리는 부분 없이 바로 다음 작업을 실행할 수 있게 하는 방식입니다. 즉 코드의 실행 결과를 별도의 공간에 맡겨둔 뒤 결과를 기다리지 않고 다음 코드를 실행하는 병렬처리 방식입니다.
(예 : 라면은 아직 다 안익었지만 옆에서 대파를 썰고 있는 느낌?)
동기(Synchronous)
- 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 기다린다.
- 작업 완료 여부를 계속해서 확인한다.
비동기(Asynchronous)
- 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 기다린다.
- 작업 완료 여부를 확인하지 않는다.
큐 작업이 필요한 이유
웹 서비스(Django)에서 발생한 요청(Task)를 Message Broker에서 받아 Celery를 이용하여 분산 처리를 진행한다. Celery에서는 작업이 완료되는 (특정 이벤트)에 DB Task를 수행한다.
예시)
DW : 실시간으로 데이터를 수집하고 관리하는 서버
AS : 이 데이터를 가공하여 사용하는 서버
메시지 브로커를 사용하면 DW에서는 수집한 데이터를 바로 메세지 큐에 Publish(적재)하고 AS는 메시지를 Subscribe(소비)하여 바로 사용하게 된다. AS에서는 별도의 조회과정이 필요없이 메세지 큐에 적재되는 메시지를 감시하고 있다가 메시지가 적재되면 바로 가져다가 사용할 수 있다.
송신자가 보낸 메시지를 메시지 큐에 적재하고 이를 수신자가 받아서 사용하는 구조이다
→ celery -A proj flower --port=5555
flower 설치후 celery를 웹페이지로 실형결과등을 잘 보이게 함
—> 진짜 눈물난다. 에러 해결 및 실습 성공!!!!!!!!!!!!
실습해본 사이트 : celery1//celery2 둘이 짬뽕해서 함
참고 : 동시/병렬/비동기 프로그래밍//비동기 큐 작업