Celery를 이용한 배치 작업 처리

2020. 10. 16. 20:39서버 프로그래밍

Flask + uwsgi + NginX로 구현된 API 서버에서 무거운 쓰레드를 돌리려고 하면, uwsgi가 respawn될 때마다 강제로 쓰레드가 종료되어 매번 임의 중단되는 문제 발생. 이를 해결하기 위해 Celery 도입 

velog.io/@yvvyoon/celery-first-step-1

 

Celery 첫 걸음마 떼기 (1/2)

지난 포스트를 작성하면서 Celery가 무엇에 쓰는 물건인지를 간략하게 개요 성격으로 알아보았다. 이번 포스트에서는 실제 Python 코드를 작성하면서 Celery 사용법을 익히고 각 브로커에 대해 더 자

velog.io

연동 테스트 무사 완료후, 데몬으로 상시 실행 하여 연동되도록 처리

jinmay.github.io/2019/11/11/django/django-celery-conf-systemd/

 

Celery 데몬으로 관리하기

지금까지는 로컬에서 테스트 하기 위해 celery -A worker -l info 를 통해서 실행했다. 수동으로 프로세스를 관리하지 않고 데몬으로 하기 위한 필요한 작업들을 정리하자. 간단하게 정리하자면 C

jinmay.github.io

devlog.jwgo.kr/2019/07/05/celery-daemonization/

 

데몬으로 셀러리(Celery) 돌리기 · Tonic

사이트 운영에 도움을 주실 수 있습니다. 고맙습니다. --> 데몬으로 셀러리(Celery) 돌리기 2019년 07월 05일 이 문서는 Celery 공식 문서 중 데몬화하기에서 Systemd 일부를 발췌하여 실제 데몬으로 돌리�

devlog.jwgo.kr

 

주의 : Celery 5.0의 경우 multi start의 옵션이 변경되어 -A 옵션을 사용할 수 없다. (이걸로 쓸데없이 시간 까먹음)

celery multi v5.0.0 (singularity)
> Starting nodes...
Usage: __main__.py worker [OPTIONS]
Try '__main__.py worker --help' for help.

Error: no such option: --A
        > worker1@ip-10-0-0-192: * Child terminated with exit code 2
FAILED

그래서 Celery 버전을 4.4.1로 변경하여 다시 실행하니 정상 동작!

pip3 install celery==4.4.1
Collecting celery==4.4.1
  Downloading https://files.pythonhosted.org/packages/82/39/162a8ee999c563571b1fa2aab79f888a80fdf129eda7112f90e435e96305/celery-4.4.1-py2.py3-none-any.whl (422kB)
    100% |████████████████████████████████| 430kB 1.4MB/s
Collecting kombu<4.7,>=4.6.8 (from celery==4.4.1)
  Downloading https://files.pythonhosted.org/packages/9e/34/3eea6a3a9ff81b0c7ddbdceb22a1ffc1b5907d863f27ca19a68777d2211d/kombu-4.6.11-py2.py3-none-any.whl (184kB)
    100% |████████████████████████████████| 194kB 1.5MB/s
Collecting vine==1.3.0 (from celery==4.4.1)
  Using cached https://files.pythonhosted.org/packages/7f/60/82c03047396126c8331ceb64da1dc52d4f1317209f32e8fe286d0c07365a/vine-1.3.0-py2.py3-none-any.whl
Collecting pytz>dev (from celery==4.4.1)
  Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl
Collecting billiard<4.0,>=3.6.3.0 (from celery==4.4.1)
  Using cached https://files.pythonhosted.org/packages/e8/5e/7591866ff45b370354bd20291cb6f87ddb2eef1f1c88c890a38412037e11/billiard-3.6.3.0-py3-none-any.whl
Collecting amqp<2.7,>=2.6.0 (from kombu<4.7,>=4.6.8->celery==4.4.1)
  Downloading https://files.pythonhosted.org/packages/bc/90/bb5ce93521772f083cb2d7a413bb82eda5afc62b4192adb7ea4c7b4858b9/amqp-2.6.1-py2.py3-none-any.whl (48kB)
    100% |████████████████████████████████| 51kB 4.5MB/s
Collecting importlib-metadata>=0.18; python_version < "3.8" (from kombu<4.7,>=4.6.8->celery==4.4.1)
  Using cached https://files.pythonhosted.org/packages/6d/6d/f4bb28424bc677bce1210bc19f69a43efe823e294325606ead595211f93e/importlib_metadata-2.0.0-py2.py3-none-any.whl
Collecting zipp>=0.5 (from importlib-metadata>=0.18; python_version < "3.8"->kombu<4.7,>=4.6.8->celery==4.4.1)
  Using cached https://files.pythonhosted.org/packages/64/f2/0aa52375e14863b377bc9eb58fde6ec48e0a7f73fdf91c9876669559fe45/zipp-3.3.1-py3-none-any.whl
Installing collected packages: vine, amqp, zipp, importlib-metadata, kombu, pytz, billiard, celery
Successfully installed amqp-5.0.1 billiard-3.6.3.0 celery-5.0.0 importlib-metadata-2.0.0 kombu-5.0.2 pytz-2020.1 vine-5.0.0 zipp-3.3.1

celery --version
4.4.1 (cliffs)

 

주의2 : Celery의 hard time limit이 디폴트로 300초 (5분)으로 제한되어 있어서, 그 이상의 작업을 진행하려고 하면 300초후에 강제로 worker를 종료시켜버림. 필요한 만큼 충분하게 hard time limit을 변경해주어야 함

stackoverflow.com/questions/11672179/setting-time-limit-on-specific-task-with-celery

 

Setting Time Limit on specific task with celery

I have a task in Celery that could potentially run for 10,000 seconds while operating normally. However all the rest of my tasks should be done in less than one second. How can I set a time limit...

stackoverflow.com

 

* 참고 : 이 방법 이전에는 uWSGI의 쓰레드 기능을 이용하여 처리하고자 해보았으나, 결과적으로는 Python thread나 별다른 차이가 없었다. 이 역시 Worker들이 respawn 되면 강제 종료 처리될 뿐.

blog.kshgroup.kr/background-jobs-with-flask/

 

[번역] Flask 에서 백그라운드 작업을 처리하는 방법

Flask 에서 백그라운드 작업을 병렬적으로 처리하는 방법에 대해 알아보았습니다.

blog.kshgroup.kr