본문 바로가기

Web

celery 적용한 django app의 비동기 수행 실험.

이전의 포스팅에서 간랸한 예제샘플을 django에 간단하게 적용해보는 것을 다뤘다.


http://abipictures.tistory.com/895


그런데, 혹시나 비동기 태스크를 수행하면 어떻게 된다는건지.. 도통 감이 안오시는 분을 위해 테스트 결과를 한번 더 보여드리고자 한다.



테스트는 이렇다.


이전에 포스팅에서 views.py 소스코드를 아래와 같이 바꿨다..


from django.http import HttpResponse

from synapseTasks import tasks


def test_celery(request):

    result2 = tasks.add.delay(1,5)

    result3 = tasks.add.delay(2,5)

    result4 = tasks.add.delay(3,5)

    result5 = tasks.add.delay(4,5)

    result = tasks.sleeptask.delay(0)

    result6 = tasks.add.delay(5,5)

    result6 = tasks.add.delay(6,5)

    result6 = tasks.add.delay(7,5)

    result6 = tasks.add.delay(8,5)

    result6 = tasks.add.delay(9,5)

    result6 = tasks.add.delay(10,5)

    return HttpResponse("this is task test (id : %s)"%result.id)


뭐 별거 없다. add라는 함수를 몇번 실행하는데, 그 중간에 2초의 시간을 설정한 sleeptask함수를 사이에 끼워넣었다.


동기화.. 즉, 순차적으로 실행이 된다고 하면.. 6, 7, 8, 9,...(2초후) 0,.. 10, 11, 12, 13, 14, 15. 이렇게 출력될 것이다.


그렇지만, 비동기 태스크 큐라는 것은 위의 하나하나 태스크가 병렬, 비동기적으로 수행되기 때문에 아래와 같이 출력될 것이다.


[2013-06-05 09:51:22,021: INFO/MainProcess] consumer: Connected to amqp://guest@127.0.0.1:5672//.

[2013-06-05 09:51:24,643: INFO/MainProcess] Got task from broker: tasks.add[08badefb-3b89-4f81-aa6f-ec7426d1e88a]

[2013-06-05 09:51:24,647: INFO/MainProcess] Got task from broker: tasks.add[08d07d47-73bc-4ccd-b8ee-137afae8930a]

[2013-06-05 09:51:24,647: INFO/MainProcess] Got task from broker: tasks.add[c4230068-6663-459c-b72b-e7d97aad446c]

[2013-06-05 09:51:24,647: INFO/MainProcess] Got task from broker: tasks.add[a83ceca2-6d63-46ca-a9b7-59b59bd8ff02]

[2013-06-05 09:51:24,648: INFO/MainProcess] Got task from broker: tasks.sleeptask[39b18a5d-37c2-437a-864a-3cb9e73ec294]

[2013-06-05 09:51:24,648: INFO/MainProcess] Got task from broker: tasks.add[220908b7-0a59-41cc-8759-02b468c0e530]

[2013-06-05 09:51:24,648: INFO/MainProcess] Got task from broker: tasks.add[145aaba1-d174-420f-938b-63254ace591d]

[2013-06-05 09:51:24,648: INFO/MainProcess] Got task from broker: tasks.add[015462ac-dbb9-493d-801e-23b0b40239da]

[2013-06-05 09:51:24,648: INFO/MainProcess] Got task from broker: tasks.add[fe5526b0-dac0-44ac-af4a-f475e9fda08f]

[2013-06-05 09:51:24,649: INFO/MainProcess] Got task from broker: tasks.add[a821a90e-586e-4ae0-8d1f-6d5c495190c2]

[2013-06-05 09:51:24,649: INFO/MainProcess] Got task from broker: tasks.add[e37b20e7-02d3-41a2-9d72-97581542000f]

[2013-06-05 09:51:24,728: INFO/MainProcess] Task tasks.add[08badefb-3b89-4f81-aa6f-ec7426d1e88a] succeeded in 0.0842771530151s: 6

[2013-06-05 09:51:24,794: INFO/MainProcess] Task tasks.add[08d07d47-73bc-4ccd-b8ee-137afae8930a] succeeded in 0.145333051682s: 7

[2013-06-05 09:51:24,795: INFO/MainProcess] Task tasks.add[c4230068-6663-459c-b72b-e7d97aad446c] succeeded in 0.144882202148s: 8

[2013-06-05 09:51:24,795: INFO/MainProcess] Task tasks.add[a83ceca2-6d63-46ca-a9b7-59b59bd8ff02] succeeded in 0.142053127289s: 9

[2013-06-05 09:51:24,836: INFO/MainProcess] Task tasks.add[e37b20e7-02d3-41a2-9d72-97581542000f] succeeded in 0.108502864838s: 15

[2013-06-05 09:51:24,895: INFO/MainProcess] Task tasks.add[a821a90e-586e-4ae0-8d1f-6d5c495190c2] succeeded in 0.10031914711s: 14

[2013-06-05 09:51:24,895: INFO/MainProcess] Task tasks.add[015462ac-dbb9-493d-801e-23b0b40239da] succeeded in 0.10028886795s: 12

[2013-06-05 09:51:24,895: INFO/MainProcess] Task tasks.add[fe5526b0-dac0-44ac-af4a-f475e9fda08f] succeeded in 0.100656032562s: 13

[2013-06-05 09:51:24,936: INFO/MainProcess] Task tasks.add[145aaba1-d174-420f-938b-63254ace591d] succeeded in 0.100257873535s: 11

[2013-06-05 09:51:24,995: INFO/MainProcess] Task tasks.sleeptask[39b18a5d-37c2-437a-864a-3cb9e73ec294] succeeded in 0.0994789600372s: 0

[2013-06-05 09:51:24,995: INFO/MainProcess] Task tasks.add[220908b7-0a59-41cc-8759-02b468c0e530] succeeded in 0.100178003311s: 10




비동기 이기때문에.. 결과는 당연히 순차적으로 결과가 나오지 않고, 먼저 처리되는 것부터 출력된다.