바뀜

둘러보기로 가기 검색하러 가기
2,902 바이트 추가됨 ,  2023년 12월 13일 (수) 21:21
편집 요약 없음
71번째 줄: 71번째 줄:     
# Load task modules from all registered Django app configs.
 
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()  # 선택사항. 자동으로 하위 앱의 tasks.py를 탐색한다.
+
app.autodiscover_tasks()  # 선택사항. 자동으로 하위 앱의 tasks.py를 탐색한다. 맨 마지막의 tasks를 바꾸면 다른 이름으로 지정할 수도 있다.
 +
# ex) app.autodiscover_othername()
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
152번째 줄: 153번째 줄:  
뭔가 성공적인 메시지가 뜨면 준비 완료.
 
뭔가 성공적인 메시지가 뜨면 준비 완료.
   −
task.py의 내용이 바뀌면 재실행 해주어야 한다.(장고의 내용이 바뀌면 재실행하듯.)
+
tasks.py의 내용이 바뀌면 재실행 해주어야 한다.(장고의 내용이 바뀌면 재실행하듯.)
|celery -A 프로젝트명.celery worker --loglevel=info
+
 
 +
 
 +
이후 task를 받으면 <code>[2023-01-12 19:11:47,323: INFO/SpawnPoolWorker-5] child process 4480 calling self.run()</code>과 같이 작업을 띄운다.
 +
|celery -A 프로젝트명 worker --loglevel=info
 +
|-
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
=== 운영체제별 실행 ===
 +
장고 서버 뿐 아니라 셀러리도 따로 실행해주어야 작업이 수행된다.
 +
{| class="wikitable"
 +
!의도
 +
!설명
 +
!방법
 +
|-
 +
|윈도우에서
 +
|윈도우에선 지원을 하지 않는다. 윈도우에선 self.run()은 띄워도 작업이 진행되지 않는다.
 +
굳이 윈도우에서 쓰고 싶다면... 아래 라이브러리 설치 후 우측과 같이 쓰자.
 +
 
 +
pip install gevent
 +
|celery -A 프로젝트명 worker -l info -P gevent
 +
|-
 +
|리눅스에서
 +
|&를 붙여도 백그라운드 실행이 안되고 일반 실행과 동일하게 실행된다;;
 +
보통 서비스 중에 프로세스가 죽는 등의 문제에 대응하기 위해 데몬화 하여 실행하는데, 여기에선 단순 백그라운드 실행을 안내한다.
 +
{| class="wikitable"
 +
|+사전 준비
 +
!설명
 +
!방법
 +
|-
 +
|디렉토리 만들기
 +
|sudo mkdir /var/run/celery/
 +
sudo mkdir /var/log/celery/
 +
|-
 +
|권한 변경
 +
|sudo chown -R 유저그룹:유저명 /var/run/celery/
 +
sudo chown -R 유저그룹:유저명 /var/log/celery/
 
|}
 
|}
이후 운용에선 굳이 셀러리를 시작시켜주는 게 아니라 장고에서 자연스레 돌리는 듯하다.[확인필요]
+
|
 +
{| class="wikitable"
 +
!설명
 +
!방법
 +
|-
 +
|백그라운드 실행
 +
|# logfile경로 등은 자유롭게 설정.
    +
celery multi start worker -A 프로젝트명 --logfile=/project/mysite/celery.log
 +
|-
 +
|종료
 +
|celery multi stop worker -A config
 +
|-
 +
|재실행
 +
|celery multi restart worker -A config --logfile=/project/mysite/celery.log
 +
|}
 +
|}
 
== DB조작 작업 ==
 
== DB조작 작업 ==
 
{| class="wikitable"
 
{| class="wikitable"
211번째 줄: 265번째 줄:  
|-
 
|-
 
|task 작성
 
|task 작성
|
+
|task를 작성할 땐 에러메시지를 곧바로 피드백받기 어려우니....
 +
 
 +
일단 작성 후 view에서 delay() 없이 실행하며 작동을 확인한 후 진행하자.
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
from celery_tutorial.celery import app  # celery를 등록한 경로에서.
 
from celery_tutorial.celery import app  # celery를 등록한 경로에서.
229번째 줄: 285번째 줄:  
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
 +
 +
= 이외 팁 =
 +
보통 무언가를 구현할 때 중간과정마다 print함수로 에러지점을 찾아내는데, task에서 실행되는 작업은 다른 프로세스에서 실행되기에 print 내용이 나오지 않는다. 때문에 개발환경에선 delay가 아닌 그냥 함수로 실행하고 개발이 끝난 후 delay 기능을 넣는 편이 좋다.
 +
 +
= 관련 에러 =
 +
 +
=== Object of type User is not JSON serializable, Object of type HomeworkSubmit is not JSON serializable ===
 +
일반 파이썬 함수에선 모델을 넣어주어도 제대로 작동하지만, celery로 넘기는 것은 다른 서버로 데이터를 넘기는 것으로, 일반적으로 통용되는 JSON 형태로 넘어간다. 하지만, 장고에서 사용하는 모델은 파이썬과 장고 내에서만 사용되는 것으로, JSON으로 직렬화 작업이 필요한데, 장고의 모델객체, request 따위는 너무 복잡해 직렬화가 되지 않는다. 즉, 모델을 직접 넘겨서 task에서 다룰 수 없다.
 +
 +
=> 직렬화 함수를 짜서 넘길 수도 있지만, 이 역시 상황에 따라 또 추가작업이 필요하기에 id를 넘겨 간접적으로 다루게 하는 게 이상적이다.
 
[[분류:Celery]]
 
[[분류:Celery]]

둘러보기 메뉴