【发布时间】:2019-09-27 03:54:34
【问题描述】:
以下任务有不同的要求。 slow 任务应该一个接一个地执行。 fast 任务可以做同样的事情(或更多),但应该独立于slow 任务。
我将它们绑定到不同的队列,但全局并发仍然适用于两者。如果它是1,那么一个任务要么从两个队列之一中拉出,要么如果它是>1,那么慢速任务可以有多个不应该执行的任务。
@app.task
def slow(x, y):
# slow operation, only one at a time with concurrency of 1
heavy_operation_takes_10_minutes()
@app.task
def fast(x, y):
# can also be concurrency of 1 or more, as long as independent of `slow` task
# ...
return x + y
Celery 可以做到这一点吗?
【问题讨论】:
-
您可以实现锁定,您可以将慢速任务作为链的一部分调用...您如何以及为什么调用这些任务?
-
我也想过这个问题,但是锁定会从队列中拉出任务,同时可以被其他worker执行。
-
在最坏的情况下,
slow任务函数被执行 N 次,其中 N-1 被锁定,fast任务还在等着拿一个 -
如果你有一个可靠的锁定机制,一次只允许一个任务获取锁,你可以“重试”没有获取锁的任务,这会将它放回队列中
-
如果你必须避免把任务放到队列的后面——“重试”。那么等待锁定将是你最好的选择
标签: python rabbitmq celery amqp