2020. 10. 16. 20:39ㆍ서버 프로그래밍
Flask + uwsgi + NginX로 구현된 API 서버에서 무거운 쓰레드를 돌리려고 하면, uwsgi가 respawn될 때마다 강제로 쓰레드가 종료되어 매번 임의 중단되는 문제 발생. 이를 해결하기 위해 Celery 도입
velog.io/@yvvyoon/celery-first-step-1
연동 테스트 무사 완료후, 데몬으로 상시 실행 하여 연동되도록 처리
jinmay.github.io/2019/11/11/django/django-celery-conf-systemd/
devlog.jwgo.kr/2019/07/05/celery-daemonization/
주의 : 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
* 참고 : 이 방법 이전에는 uWSGI의 쓰레드 기능을 이용하여 처리하고자 해보았으나, 결과적으로는 Python thread나 별다른 차이가 없었다. 이 역시 Worker들이 respawn 되면 강제 종료 처리될 뿐.
blog.kshgroup.kr/background-jobs-with-flask/