바뀜

2,140 바이트 추가됨 ,  2023년 12월 13일 (수) 21:21
편집 요약 없음
159번째 줄: 159번째 줄:  
|celery -A 프로젝트명 worker --loglevel=info
 
|celery -A 프로젝트명 worker --loglevel=info
 
|-
 
|-
|윈도우에서.
+
|
 +
|
 +
|
 +
|}
 +
 
 +
=== 운영체제별 실행 ===
 +
장고 서버 뿐 아니라 셀러리도 따로 실행해주어야 작업이 수행된다.
 +
{| class="wikitable"
 +
!의도
 +
!설명
 +
!방법
 +
|-
 +
|윈도우에서
 
|윈도우에선 지원을 하지 않는다. 윈도우에선 self.run()은 띄워도 작업이 진행되지 않는다.
 
|윈도우에선 지원을 하지 않는다. 윈도우에선 self.run()은 띄워도 작업이 진행되지 않는다.
 
굳이 윈도우에서 쓰고 싶다면... 아래 라이브러리 설치 후 우측과 같이 쓰자.
 
굳이 윈도우에서 쓰고 싶다면... 아래 라이브러리 설치 후 우측과 같이 쓰자.
165번째 줄: 177번째 줄:  
pip install gevent
 
pip install gevent
 
|celery -A 프로젝트명 worker -l info -P 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"
242번째 줄: 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]]