๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป/celery + redis

[Celery] Celery with Redis (python) : ๋น„๋™๊ธฐ ์ž‘์—… queue

by ๋ฐ”์ฟ„๋ฆฌ 2022. 6. 6.

โœ… Celery ?

celery๋Š” ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์— ๊ธฐ๋ฐ˜์„ ๋‘” ์˜คํ”ˆ ์†Œ์Šค ๋น„๋™๊ธฐ ํ…Œ์Šคํฌ ํ, ์žก ํ์ด๋‹ค.

์Šค์ผ€์ค„๋ง์„ ์ง€์›ํ•˜์ง€๋งŒ ์‹ค์‹œ๊ฐ„ ์šด์˜์— ์ดˆ์ ์„ ๋‘๊ณ ์žˆ๋‹ค.

 

1๏ธโƒฃ ์‹œ์ž‘

redis๊ฐ€ ์‹คํ–‰๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (์•„๋ž˜ ๋งํฌ ์ฐธ๊ณ )

 

[Redis] redis๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ (docker/source download)

โœ… Redis ? Remote Dictionary Server์˜ ์•ฝ์ž๋กœ์„œ, "ํ‚ค-๊ฐ’" ๊ตฌ์กฐ์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค. 1๏ธโƒฃ Docker ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹œ์ž‘

bonory.tistory.com

 

2๏ธโƒฃ ์„ค์น˜

pip3 install celery

 

3๏ธโƒฃ ์‹คํ–‰

tasks.py

 

from celery import Celery

app = Celery('tasks', broker = 'redis://localhost//')

app.conf.task_default_queue = 'default'
app.conf.task_queues = (
    Queue('default', routing_key='task.#'),
)

@app.task
def long_task(x):
    print(f"{x} : start")
    pytime.sleep(10)
    print(f"{x} : end")
    return x

 

 

terminal ์—์„œ celery worker server ์‹คํ–‰

 

python3 -m celery -A tasks worker -Q default --loglevel=info

 

 -------------- celery@MacBook-Pro.local v5.2.6 (dawn-chorus)
--- ***** ----- 
-- ******* ---- macOS-10.16-x86_64-i386-64bit 2022-05-30 09:33:30
- *** --- * --- 
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x7fef50fb9550
- ** ---------- .> transport:   redis://localhost:6379
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> default          exchange=default(direct) key=task.#
                

[tasks]
  . tasks.long_task

[2022-05-30 09:33:30,586: INFO/MainProcess] Connected to redis://localhost:6379/0
[2022-05-30 09:33:30,588: INFO/MainProcess] mingle: searching for neighbors
[2022-05-30 09:33:31,598: INFO/MainProcess] mingle: all alone
[2022-05-30 09:33:31,620: INFO/MainProcess] celery@MacBook-Pro.local ready.

 

1. app : ํ˜„์žฌ ์„œ๋ฒ„๋กœ ๊ฐ€๋™ํ•œ app์˜ ์ด๋ฆ„๊ณผ ID

2. transport : message broker

3. result : task ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ผ backend (์ผ๋ฐ˜์ ์œผ๋กœ celery๋Š” result backend๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.)

4. concurrency : prework๋œ worker ํ”„๋กœ์„ธ์Šค ์ˆซ์ž (์ผ๋ฐ˜์ ์œผ๋กœ CPU ์ฝ”์–ด ์ˆซ์ž๋งŒํผ ๊ฐ€๋™๋œ๋‹ค.)

 

 

4๏ธโƒฃ ๋™์‹œ์„ฑ(concurrency, worker) ์ง€์ •ํ•˜๊ธฐ

์ด๋ฒˆ์— ์ง„ํ–‰ํ•  ์ž‘์—…์ด ๊ธด ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…์ด๋‹ค.

์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด queue ๋ฐฉ์‹์œผ๋กœ ๋‹ค ์Œ“์•„๋‘๊ณ  FIFO์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋ คํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋™์‹œ์„ฑ์„ 1๋กœ ์ง€์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” celery ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๋•Œ `--concurrency=1` ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

 

python3 -m celery -A tasks worker -Q default --loglevel=info --concurrency=1

 

 -------------- celery@MacBook-Pro.local v5.2.6 (dawn-chorus)
--- ***** ----- 
-- ******* ---- macOS-10.16-x86_64-i386-64bit 2022-05-30 09:32:44
- *** --- * --- 
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x7f97a1069a00
- ** ---------- .> transport:   redis://localhost:6379
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> default          exchange=default(direct) key=task.#
                

[tasks]
  . tasks.long_task

[2022-05-30 09:32:45,095: INFO/MainProcess] Connected to redis://localhost:6379/0
[2022-05-30 09:32:45,097: INFO/MainProcess] mingle: searching for neighbors
[2022-05-30 09:32:46,105: INFO/MainProcess] mingle: all alone
[2022-05-30 09:32:46,123: INFO/MainProcess] celery@MacBook-Pro.local ready.

 

 

โ˜‘๏ธ celery worker guide

 

Workers Guide โ€” Celery 5.2.7 documentation

This document describes the current stable version of Celery (5.2). For development docs, go here. Workers Guide You can start the worker in the foreground by executing the command: $ celery -A proj worker -l INFO For a full list of available command-line

docs.celeryq.dev

 

5๏ธโƒฃ ํ…Œ์ŠคํŠธ

์‹คํ–‰ ์ฝ”๋“œ

 

for i in range(1, 6):
    long_task.apply_async(args=[i], queue='default')

 

์‹คํ–‰ ๊ฒฐ๊ณผ

 

[2022-05-30 09:44:24,594: INFO/MainProcess] Task tasks.long_task[e97349bd-1807-4019-906c-f61e10d3cbc1] received
[2022-05-30 09:44:24,596: INFO/MainProcess] Task tasks.long_task[a3d4ed9d-40b9-4a95-9b22-28c24f835b04] received
[2022-05-30 09:44:24,596: WARNING/ForkPoolWorker-1] 1 : start
[2022-05-30 09:44:24,597: INFO/MainProcess] Task tasks.long_task[6395d77d-708f-441e-8a93-fa47726f9b01] received
[2022-05-30 09:44:24,597: INFO/MainProcess] Task tasks.long_task[bfeec24d-96ba-4560-99b2-18faec595e03] received
[2022-05-30 09:44:24,598: INFO/MainProcess] Task tasks.long_task[6992e54a-0e86-4582-bbb4-4b9d66829a53] received
[2022-05-30 09:44:34,597: WARNING/ForkPoolWorker-1] 1 : end
[2022-05-30 09:44:34,600: INFO/ForkPoolWorker-1] Task tasks.long_task[e97349bd-1807-4019-906c-f61e10d3cbc1] succeeded in 10.004834291999998s: 1
[2022-05-30 09:44:34,605: WARNING/ForkPoolWorker-1] 2 : start
[2022-05-30 09:44:44,606: WARNING/ForkPoolWorker-1] 2 : end
[2022-05-30 09:44:44,608: INFO/ForkPoolWorker-1] Task tasks.long_task[a3d4ed9d-40b9-4a95-9b22-28c24f835b04] succeeded in 10.004181875000002s: 2
[2022-05-30 09:44:44,611: WARNING/ForkPoolWorker-1] 3 : start
[2022-05-30 09:44:54,613: WARNING/ForkPoolWorker-1] 3 : end
[2022-05-30 09:44:54,615: INFO/ForkPoolWorker-1] Task tasks.long_task[6395d77d-708f-441e-8a93-fa47726f9b01] succeeded in 10.004144500000002s: 3
[2022-05-30 09:44:54,618: WARNING/ForkPoolWorker-1] 4 : start
[2022-05-30 09:45:04,619: WARNING/ForkPoolWorker-1] 4 : end
[2022-05-30 09:45:04,620: INFO/ForkPoolWorker-1] Task tasks.long_task[bfeec24d-96ba-4560-99b2-18faec595e03] succeeded in 10.002915666s: 4
[2022-05-30 09:45:04,621: WARNING/ForkPoolWorker-1] 5 : start
[2022-05-30 09:45:14,622: WARNING/ForkPoolWorker-1] 5 : end
[2022-05-30 09:45:14,623: INFO/ForkPoolWorker-1] Task tasks.long_task[6992e54a-0e86-4582-bbb4-4b9d66829a53] succeeded in 10.003116958s: 5

 

 

 

โ˜‘๏ธ celery routing์— ๋Œ€ํ•œ ์„ค์ • ๊ฐ’ ๊ด€๋ จ guide

 

Routing Tasks โ€” Celery 5.2.7 documentation

This document describes the current stable version of Celery (5.2). For development docs, go here. Routing Tasks Note Alternate routing concepts like topic and fanout is not available for all transports, please consult the transport comparison table. The s

docs.celeryq.dev