为什么单个 celery 任务甚至比 I/O 绑定任务的同步对应任务快得多

问题描述 投票:0回答:1

我正在学习 Python 中的并发

我设置了 Celery 运行一个脚本来获取请求 50 次,只需要 0.13 秒 就完成了,真让我惊讶!

当我与常规同步编程相比时,大约需要 1 分钟才能完成

afaik,celery 将生成一个进程池来执行任务。但我认为 celery Worker 执行 500 个任务不会比同步执行单个任务快得多。

# sync.py
import json
import requests
from timer import Timer

URL = 'https://httpbin.org/uuid'

def fetch(url):
    response = requests.get(url)
    data = json.loads(response.text)
    print(data['uuid'])


def main():
    with Timer():
        for _ in range(1):
            fetch(URL)

main()
# take ~50 seconds
# celery_demo.py
from celery import Celery
from timer import Timer
import json
import requests

URL = 'https://httpbin.org/uuid'

BROKER_URL = 'redis://localhost:6379/0'
RESULT_BACKEND = 'redis://localhost:6379/0'

app = Celery(__name__, broker=BROKER_URL, backend=RESULT_BACKEND)


@app.task(name='fetch')
def fetch():
    res = requests.get(URL)
    return res.json()['uuid']


def main():
    with Timer():
        for i in range(50):
            res = fetch.delay()
            print(res)


if __name__ == '__main__':
    main()

# Celery configuration
# celery -A celery_demo.app worker --concurrency=4

# takes ~0.1 to 0.2 seconds

我们可以给我一些关于这个事实的见解吗?

python concurrency celery
1个回答
0
投票

使用 celery 任务,您可以计算将 50 个任务执行放入 celery 队列中需要多长时间,但无法测量 celery 何时完成。

因此,当

Timer
上下文离开时,请求很可能根本没有完成 - 并且您有例如队列中剩余大约 46 个任务。

文档在这里:https://docs.celeryq.dev/en/stable/userguide/calling.html;

delay()
方法仅发送任务,但不等待其完成。

© www.soinside.com 2019 - 2024. All rights reserved.