有没有办法确保某些任务不是并行执行的?

时间:2015-07-21 16:32:22

标签: python python-2.7 celery

我正在编写一个Celery任务,该任务将对在BitBucket中创建的拉取请求进行一些测试。 我的问题是,如果在我的任务完成之前更新了拉取请求,它将再次触发任务,因此我最终可能有两个任务同时在同一拉取请求上运行测试。 有什么办法可以阻止这个吗?并确保如果处理某个拉取请求的任务已经在进行中,那么我等待它完成然后再次开始处理它(从排队的新任务)

当我监控多个具有多个PR的回购时,我希望如果事件即将来临,但是来自不同的回购或不同的拉动请求来启动它并运行它。 如果我已经从同一个仓库进行了相同的拉取请求,我只需要排队。

有没有想过芹菜可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您正在寻找mutex。对于Celery,有celery_mutexcelery_once。特别是,celery_once声称正在按照你的要求做,但我没有经验。

您还可以使用具有全局互斥实现的Python multiprocessing,或使用您已有的共享存储。

如果任务在同一台机器上运行,则操作系统具有锁定机制。

答案 1 :(得分:1)

实现此目的的最简单方法是将worker并发设置为1,以便一次只执行一个任务。

将任务路由到单独的队列。

your_task.apply_async(foo, queue='bar')

然后以一个

的可靠性开始你的工作人员
celery worker -Q bar -c 1

另见Celery - one task in one second