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로 받아야 한다. |
| |- | | |- |
− | |샐러리 실행 | + | |준비 확인 |
| + | 샐러리 실행 |
| |[데몬으로 시작하는 법은 따로 있나보다.] | | |[데몬으로 시작하는 법은 따로 있나보다.] |
| 다른 터미널 창을 열어 따로 실행해주어야 한다. | | 다른 터미널 창을 열어 따로 실행해주어야 한다. |