비동기 작업 처리는 웹 애플리케이션에서 많이 사용되는 기술 중 하나입니다. 이러한 작업은 사용자의 요청에 응답하지 않고 백그라운드에서 실행되므로 응답 시간을 크게 단축시킬 수 있습니다. 이번에는 Python에서 Celery를 사용하여 비동기 작업을 처리하는 방법에 대해 알아보겠습니다.
Celery란?
Celery는 분산 작업 큐를 구현한 오픈 소스 프레임워크로, 비동기 작업 처리에 주로 사용됩니다. Celery는 작업자(worker)와 작업 큐(queue)로 구성되어 있으며, 작업자는 큐에서 작업을 가져와 실행하는 역할을 담당합니다. 작업자는 여러 대의 서버로 구성될 수 있으며, 분산 작업 처리를 통해 확장성과 신뢰성을 보장할 수 있습니다.
Celery 설치하기
우선, Celery를 설치해야 합니다. 아래의 명령을 사용하여 Celery를 설치할 수 있습니다.
pip install celery
Celery 사용하기
Celery를 사용하여 비동기 작업을 처리하려면 다음과 같은 단계를 거쳐야 합니다.
1. Celery 프로젝트 설정하기
Celery를 사용하기 위해선 프로젝트에 Celery 설정 파일을 추가해야 합니다. celery.py
또는 tasks.py
라는 이름의 파일을 생성하고, 아래와 같이 내용을 작성합니다.
from celery import Celery
app = Celery('myapp', broker='amqp://guest@localhost//', backend='rpc://', include=['myapp.tasks'])
app.conf.update(task_serializer='json', result_serializer='json', accept_content=['json'], enable_utc=True)
if __name__ == '__main__':
app.start()
위의 설정 파일에서 broker
는 Celery 작업 큐에 접속하기 위한 URL을 의미하며, backend
는 작업의 결과를 저장하기 위한 URL을 의미합니다. include
는 Celery 작업자가 실행할 작업들이 정의된 파일을 지정합니다. task_serializer
, result_serializer
, accept_content
와 enable_utc
옵션은 각각 작업과 결과의 직렬화 방식과 UTC 시간 설정에 관한 옵션입니다.
2. 작업 정의하기
작업 정의는 작업자가 실행할 실제 작업을 의미합니다. 작업 정의는 tasks.py
파일에 다음과 같은 형식으로 추가할 수 있습니다.
from myapp.celery import app
@app.task
def add(x, y):
return x + y
위의 예시에서는 add
라는 작업을 정의하였으며, 두 개의 인자 x
와 y
를 받아 더한 결과를 반환합니다. 여러 개의 작업을 정의해야 할 경우, 해당 파일에 작업을 추가하면 됩니다.
3. 작업 실행하기
작업을 실행하기 위해선 Celery 작업자를 실행해야 합니다. 아래의 명령을 사용하여 작업자를 실행할 수 있습니다.
celery -A myapp.celery worker --loglevel=info
위의 명령에서 -A
옵션은 Celery 프로젝트에서 사용할 설정 파일을 지정합니다. --loglevel
은 로깅 레벨을 설정하는 옵션으로, 자세한 로그 메시지를 확인하고 싶을 경우에는 debug
로 설정할 수 있습니다.
4. 작업 호출하기
작업을 호출하기 위해선 apply_async
메소드를 사용해야 합니다. 아래의 코드는 작업을 호출하는 예시입니다.
from myapp.tasks import add
result = add.apply_async(args=[4, 2])
print(result.get())
위의 예시에서 apply_async
메소드의 args
옵션은 작업에 전달할 인자를 의미하며, get
메소드는 작업의 결과를 얻어옵니다. 작업이 비동기로 실행되기 때문에, result.get()
은 작업이 완료되기 전까지는 블로킹 상태에 있게 됩니다.
결론
Celery는 Python에서 비동기 작업을 처리하기 위한 강력한 도구입니다. 앞서 소개한 방법을 통해 Celery를 사용하여 비동기 작업을 처리할 수 있으며, 이를 통해 웹 애플리케이션의 응답 시간을 크게 개선할 수 있습니다.
더 자세한 내용은 Celery 공식 문서를 참고하시기 바랍니다.