Experiments never fail s2

실험에 실패란 없다 블로그 시즌 2

파이썬 멀티프로세싱 함수는 Celery로 처리할 수 없다?

Pythonist - 2014년 4월 2일 10:36:07 오전

웹환경에서 장시간 동작해야 하는 작업이 있다. 웹의 특성상 바로바로 응답을 해 주어야 하는데, 작업 자체가 오래걸린다면 별도의 프로세스 관리가 꼭 필요하다. 특정 웹 화면에서 작업을 제출하고, 작업의 진행현황을 보고, 작업이 완료됐을 때, 결과를 볼 수 있도록 해야 한다. 사용된 언어가 파이썬일 경우, 일반적으로 추천되는 방법은 Celery를 쓰는 것이다.

Celery는 파이썬으로 만들어진 비동기 작업 큐로써, 처음 django-celery란 이름으로 장고(Django) 어플리케이션으로 개발되었고, 지금은 Django와 분리되어 독자적으로 동작한다.

Django 프로젝트에서 어떻게 Celery를 연동하여 쓸 수 있는지는 First steps with Django 문서를 보면 쉽게 알 수 있다. 쉽게 말해 특정 함수에 shared_task 데코레이터를 붙이고 호출할 때, .delay 만 붙히면 된다. Celery를 이용한 긴 작업 처리라는 한국어 자료를 참고할 수 도 있다. (Spoqa라는 회사 블로그인데, 파이썬을 주로 사용하는 회사인 듯)

나에게 문제가 된 부분은 multiprocessing Poll을 사용한 함수는 Celery task로 안된다는 것. Celery worker가 일반 프로세스랑 달라서 그런 듯 한데 자세한 이유는 잘 모르겠다.

관련 내용을 Stackoverflow에 질문 했는데, 딱히 원하는 답을 못찾다. 뭔가 간단한 설정으로 되게 할 수 있을 것 같은데.

멀티프로세싱으로 나눠야 하는 작업의 단위를 다른 방법으로 하는 것도 고민해봤다. 그러나, 각 작업의 결과들을 별도로 또 취합하는 일을 해야하는데, 비동기 환경에서 어찌해야하는지 잘 모르겠더라는. Twisted 처럼 아예 비동기 프레임워크도 아니고 방법이 쉽게 떠오르지 않았다.

납품일자는 다가오고 해서, 일단 급한대로 예전에 하던 방식을 그대로 썼다. 이 작업을 수행하는 별도의 명령행 스크립트를 만들고, subprocess.Popen으로 process spawn하는 방식. 이 방법도 프로세스 아이디를 알 수 있어서 나중에 이 작업이 어찌되었나 추적할 수 도 있는 장점이 있다. 다 구현하고 보니 왜 Celery를 써야 했던 것인가 의문이. (아마도 분산 환경 때문?)


Posted by Hyungyong Kim (yong27)

태그(들): async, celery, django, multiprocessing, python, queue, stackoverflow


comments powered by Disqus

« 자바스크립트로 맥 알림센터에 알림 띄우기

Mac OS X에서 Django, uWSGI, Nginx 서비스 설정 »