我正在编写一个Celery任务,该任务将对在BitBucket中创建的拉取请求进行一些测试。 我的问题是,如果在我的任务完成之前更新了拉取请求,它将再次触发任务,因此我最终可能有两个任务同时在同一拉取请求上运行测试。 有什么办法可以阻止这个吗?并确保如果处理某个拉取请求的任务已经在进行中,那么我等待它完成然后再次开始处理它(从排队的新任务)
当我监控多个具有多个PR的回购时,我希望如果事件即将来临,但是来自不同的回购或不同的拉动请求来启动它并运行它。 如果我已经从同一个仓库进行了相同的拉取请求,我只需要排队。
有没有想过芹菜可以做到这一点?
答案 0 :(得分:1)
您正在寻找mutex。对于Celery,有celery_mutex
和celery_once
。特别是,celery_once
声称正在按照你的要求做,但我没有经验。
您还可以使用具有全局互斥实现的Python multiprocessing
,或使用您已有的共享存储。
如果任务在同一台机器上运行,则操作系统具有锁定机制。
答案 1 :(得分:1)
实现此目的的最简单方法是将worker并发设置为1,以便一次只执行一个任务。
将任务路由到单独的队列。
your_task.apply_async(foo, queue='bar')
然后以一个
的可靠性开始你的工作人员celery worker -Q bar -c 1