Celery의 빛과 그림자
PYCON KOREA 2015
정민영
THE BEATPACKING COMPANY
발표자
• 정민영
• 비트패킹컴퍼니 CTO
• PyconKR 2014/Deview 2014 ‘제약을 넘어: Gevent’
발표 (Deview 2014 Top 10)
• AWSKRUG Founder / AWS Community Hero
이런 분들을 위해 준비했어요!
• 비동기 처리를 해야되긴 한다던데… 뭐가 뭔지 모르겠던 분!
• Celery가 뭔가 좋은거 같긴한데…써도 되나 의심스러우셨던
분들!
• Celery를 쓰고 있는데 뭔가 작동이 이상해서 고민이셨던 분
들!
Celery?
Distributed
Task
Queue
혹은
(종합적인)비동기 처리기
비동기 처리기?
비동기 처리기는 왜 필요한걸까?
고갱님 어떤 서비스
진지하게	 가입을	 해볼까?
이메일,	 이름,	 ..	 좋아	 가입!
비동기 처리기는 왜 필요한걸까?
어떤 서비스
진지하게	 가입을	 해볼까?
이메일,	 이름,	 ..	 좋아	 가입!
에..	 고객님	 프로필	 사진을	 
업로드하고..	  크기도	  적당히	 
3개쯤	 준비해두고..
고갱님
비동기 처리기는 왜 필요한걸까?
어떤 서비스
진지하게	 가입을	 해볼까?
이메일,	 이름,	 ..	 좋아	 가입!
에..	 고객님	 프로필	 사진을	 
업로드하고..	  크기도	  적당히	 
3개쯤	 준비해두고..	 요즘	 유
행이니까	 배경	 블러도	 만들
어	 두고…
고갱님
비동기 처리기는 왜 필요한걸까?
어떤 서비스
진지하게	 가입을	 해볼까?
이메일,	 이름,	 ..	 좋아	 가입!
에..	 고객님	 프로필	 사진을	 
업로드하고..	  크기도	  적당히	 
3개쯤	 준비해두고..	 요즘	 유
행이니까	 배경	 블러도	 만들
어	 두고…	 아	 친구도	 찾아
드려야	 하는데	 까먹을뻔	 했
네	 데헷(*^^*)..
고갱님
비동기 처리기는 왜 필요한걸까?
어떤 서비스
에..	 고객님	 프로필	 사진을	 
업로드하고..	  크기도	  적당히	 
3개쯤	 준비해두고..	 요즘	 유
행이니까	 배경	 블러도	 만들
어	 두고…	 아	 친구도	 찾아
드려야	 하는데	 까먹을뻔	 했
네	 데헷(*^^*)..	 자	 다했다	 
이제	 이메일	 보내드려야지!
비동기 처리기는 왜 필요한걸까?
어떤 서비스
어…어..	 고..고갱님??
비동기 처리기는 왜 필요한걸까?
• 비동기 처리기는 동기적으로 수행하지 않아도 되는 일들을 처
리해 주는 역활을 합니다.
• 즉 결과를 즉시 받을 필요 없거나, 지연하여 처리해야 되는 일
들을 보통 처리합니다.
• 물론 그것이 제대로 처리가 되지 않아도 된다는 이야기는 아
니기 때문에, 별도의 잘 만들어진 처리기가 필요해요!
그런데 왜 꼭
여야 하나요?
근데 왜 꼭 Celery여야 하죠?
• 완전 쉽게 연동할 수 있어요!
• (아마도) 당신이 상상할 수 있는 모든 기능을 제공해요!
• 일단 남들이 제일 많이 써요!
Celery… 너란 채소….
완전 쉽게 연동할 수 있어요!
from
 celery
 import
 Celery

app
 =
 Celery('hello',

 
 
 
 
 
 
 
 
 
 
 
 
 broker='amqp://guest@localhost//')
 
@app.task

def
 add(a,
 b):

 
 
 
 return
 a
 +
 b
완전 쉽게 연동할 수 있어요!
from
 tasks
 import
 add

add.delay(1,
 2)
 
완전 쉽게 연동할 수 있어요!
from
 tasks
 import
 add



r
 =
 add(1,
 2)

r.get(timeout=1)
 
완전 쉽게 연동할 수 있어요!
(아마도) 당신이 상상할 수 있는 모든 기능
(아마도) 당신이 상상할 수 있는 모든 기능
(아마도) 당신이 상상할 수 있는 모든 기능
T.delay(arg,
 kwarg=value)
 
!
T.apply_async((arg,
 ),
 {'kwarg':
 value})
 
!
T.apply_async(countdown=10)
 
!
T.apply_async(eta=now
 +
 timedelta(seconds=10))
 
!
T.apply_async(countdown=60,
 expires=120)
 
!
T.apply_async(expires=now
 +
 timedelta(days=2))
 
(아마도) 당신이 상상할 수 있는 모든 기능
 from celery import chain

# 2 + 2 + 4 + 8
 res = chain(add.s(2, 2), add.s(4), add.s(8))()
 res.get()
16
(아마도) 당신이 상상할 수 있는 모든 기능
 from celery import chain
!
# 2 + 2 + 4 + 8
 res = chain(add.s(2, 2), add.s(4), add.s(8))()
 res.get()
16
!
 (add.s(2, 2) | add.s(4) | add.s(8))().get()
16
(아마도) 당신이 상상할 수 있는 모든 기능
new_user_workflow = (create_user.s() | group(
import_contacts.s(),
send_welcome_email.s())
)
new_user_workflow.delay(username='artv',
first='Art',
last='Vandelay',
email='art@vandelay.com')
(아마도) 당신이 상상할 수 있는 모든 기능
from datetime import timedelta
!
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': timedelta(seconds=30),
'args': (16, 16)
},
}
!
CELERY_TIMEZONE = 'UTC'
(아마도) 당신이 상상할 수 있는 모든 기능
(아마도) 당신이 상상할 수 있는 모든 기능
뭐… 좋은건 알겠는데….
There ain't no such thing as a free lunch
There ain't no such thing as a free lunch
– kkung
비트 성장의 가장 첫번째 난관은 셀러ㄹ…

Celery의 빛과 그림자