바뀜

45 바이트 제거됨 ,  2023년 1월 11일 (수) 10:57
편집 요약 없음
5번째 줄: 5번째 줄:     
* 장고나 플라스크 등 웹서버에서 오래걸리는 작업을 수행하게 되면 timeout이 떠버려 결과를 받아볼 수가 없다. 그렇다고 웹서버의 timeout을 늘려버리면 비효율적인 자원낭비가 예상되어 함부로 늘릴 수도 없다. 그럴 때 사용하는 celery(샐러리).
 
* 장고나 플라스크 등 웹서버에서 오래걸리는 작업을 수행하게 되면 timeout이 떠버려 결과를 받아볼 수가 없다. 그렇다고 웹서버의 timeout을 늘려버리면 비효율적인 자원낭비가 예상되어 함부로 늘릴 수도 없다. 그럴 때 사용하는 celery(샐러리).
* 스케쥴링 작업을 할 때에도 사요한다.
+
* 스케쥴링 작업을 할 때에도 사용한다.
    
=== 운용방식 ===
 
=== 운용방식 ===
24번째 줄: 24번째 줄:  
|}메시지 브로커라는 외부 서버를 사용하여 작업을 수행한다. 이 메시지 브로커가 셀러리에 feed를 넘긴다.
 
|}메시지 브로커라는 외부 서버를 사용하여 작업을 수행한다. 이 메시지 브로커가 셀러리에 feed를 넘긴다.
   −
즉, 장고가 파이썬 함수를 실행하면 셀러리가 해당 작업을 큐에 올린다. 샐러리는 이를 다시 메시지브로커에.(장고는 다른 작업을 지속할 수 있도록) 작업 결과는 셀러리로 돌아온다.
+
# 장고가 파이썬 함수를 실행하면
 
+
# 셀러리가 해당 작업을 큐에 올린다.(메시지 브로커에 올린다.)
# 웹서버가 큐를 메시지 브로커에 올린다.
   
# 샐러리 워커가 일을 수행할 상황이 되면 큐를 가져와 수행한다.(워커별 독자적 처리)
 
# 샐러리 워커가 일을 수행할 상황이 되면 큐를 가져와 수행한다.(워커별 독자적 처리)
# 워커의 처리결과는 DB에 저장하여 활용한다.
+
# 워커의 처리결과는 DB 등에 저장하여 활용한다.
   −
== 기초 사용법 ==
+
== 사전 준비 ==
 
사람마다 사용하는 방식이 다르다.
 
사람마다 사용하는 방식이 다르다.
   47번째 줄: 46번째 줄:       −
만약 app.autodiscover_tasks()를 사용하지 않는다면 인스턴스를 지정할 때 app = Celery('celery_tutorial', include=['앱이름.tasks']) 형태로 기입하면 포함된 tasks.py만 찾는다.
+
 
 +
 
 +
만약 app.autodiscover_tasks()를 사용하지 않는다면..
 +
 
 +
인스턴스를 지정할 때 app = Celery('celery_tutorial', include=['앱이름.tasks']) 형태로 기입하면 포함된 tasks.py만 찾는다.
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
from __future__ import absolute_import, unicode_literals
 
from __future__ import absolute_import, unicode_literals
56번째 줄: 59번째 줄:     
# set the default Django settings module for the 'celery' program.
 
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_tutorial.settings')  # 설정파일 위치.
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트명.settings')  # 설정파일 위치.
   −
app = Celery('celery_tutorial')  # 보통 settings.py 파일이 있는 디렉토리 이름을 넣는다.
+
app = Celery('프로젝트명')  # 보통 settings.py 파일이 있는 디렉토리 이름을 넣는다.
    
# Using a string here means the worker doesn't have to serialize
 
# Using a string here means the worker doesn't have to serialize
72번째 줄: 75번째 줄:  
|장고가 시작될 때 자동실행
 
|장고가 시작될 때 자동실행
 
|자동실행을 위해 settings.py가 있는 디렉토리에 __init__.py를 만든다.
 
|자동실행을 위해 settings.py가 있는 디렉토리에 __init__.py를 만든다.
 +
위에서 등록한 샐러리 앱을 반영한다.
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
from __future__ import absolute_import, unicode_literals
 
from __future__ import absolute_import, unicode_literals
83번째 줄: 87번째 줄:  
|-
 
|-
 
|확장라이브러리
 
|확장라이브러리
|라이브러리를 설치한다.
+
|라이브러리를 설치한다.[선택사항일까. 구현해보고 진행해보자.]
 
|pip install django-celery-results
 
|pip install django-celery-results
 
|-
 
|-
113번째 줄: 117번째 줄:     
(우측은 예시로, 자세한 작성은 아래 '뷰에서의 작업'을 참고하자)
 
(우측은 예시로, 자세한 작성은 아래 '뷰에서의 작업'을 참고하자)
      
데코레이터가 붙으면 이것이 task로 인식된다.
 
데코레이터가 붙으면 이것이 task로 인식된다.
140번째 줄: 143번째 줄:  
bind=True 옵션을 쓰면 무조건 첫번째 인수는 self로 받아야 한다.
 
bind=True 옵션을 쓰면 무조건 첫번째 인수는 self로 받아야 한다.
 
|-
 
|-
|샐러리 실행
+
|준비 확인
 +
샐러리 실행
 
|[데몬으로 시작하는 법은 따로 있나보다.]
 
|[데몬으로 시작하는 법은 따로 있나보다.]
 
다른 터미널 창을 열어 따로 실행해주어야 한다.
 
다른 터미널 창을 열어 따로 실행해주어야 한다.