我正在学习 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
我们可以给我一些关于这个事实的见解吗?
使用 celery 任务,您可以计算将 50 个任务执行放入 celery 队列中需要多长时间,但无法测量 celery 何时完成。
因此,当
Timer
上下文离开时,请求很可能根本没有完成 - 并且您有例如队列中剩余大约 46 个任务。
文档在这里:https://docs.celeryq.dev/en/stable/userguide/calling.html;
delay()
方法仅发送任务,但不等待其完成。