Celery池类型和并发性

0 投票
1 回答
2772 浏览
提问于 2025-04-17 23:14

我在理解Celery中的多线程并发是怎么回事时遇到了困难。

看起来默认使用的类型是 -P eventlet。我猜 -P threads 不好用是因为有个叫GIL的东西,所以实际上不会有并发。

但是从这个例子 来看,我不能简单地指定 -P eventlet 然后就开始执行任务,我必须通过 celery.group 来启动并行任务。而且根据 这个链接,一个多进程的工作者是不会并行处理消息的。

所以总结一下,要实现任务的真正并行,我必须使用多进程。我可以使用eventlet,但我需要修改任务的运行方式。我的任务是根据外部触发随机发起的,所以我不知道我需要创建多少个任务,也不知道具体什么时候发起——所以看起来我不能在我的情况下使用eventlet。

这样理解对吗?

1 个回答

0

我刚开始尝试使用 eventlet 池,按照我目前的理解,不需要使用 group() 来调用你的任务就能享受到并发的好处。我觉得他们在示例中使用 group() 只是巧合。其实这两个概念通常是可以很好地配合在一起的。不过,我在 Python 的 for 循环中使用单独的 apply_async() 调用任务时,依然能获得 eventlet 的并发效果。如果你不需要 GroupResult 的功能,这样做也是没问题的(详细信息可以查看 http://celery.readthedocs.org/en/latest/userguide/canvas.html#groups)。

撰写回答