我的任务需要从 Internet 加载一些大文件,然后进行一些处理。同步运行加载需要 ~3s,处理需要 ~0.2s。尽管处理速度比加载快得多,但仍然需要相当长的时间。
我想知道处理我的场景的最佳 celery 配置是什么。多处理、Eventlet 还是其他?
最佳答案
在我看来,这个问题需要一个比较多进程/线程与绿色线程的答案;然而,一般来说,在 celery 并发的上下文中,使用 in 并没有什么区别,除非你的资源有限(任务太多),或者你建立了太多的出站连接并且你是 i/o-bound,那么您将不得不“绿色”并使用 eventlet。
一个好主意,我在上一届 PyCon 2013 (Messaging at Scale at Instagram) 上看到了 Instagram,他们同时使用了两者。主要用途是线程任务,然而,他们使用“绿色”方法处理那些除了向其他网站(如 twitter、facebook 和 tumbler)发出出站请求之外什么都不做的任务。这些类型的任务不值得完整线程/进程,因为没有真正的处理发生,移动,请求/响应周期需要一些时间,所以,处理这些任务的最好办法是让它们变绿。
您可以创建使用每个任务的线程/进程的工作人员,只通过特定队列处理任务,以及另一个使用 greenlets 的工作人员,只通过其他队列处理其他任务。然后你就可以根据上面的解释决定哪个去哪里了!
关于python - io/cpu 绑定(bind)任务的 Celery 并发配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18119960/