有什么方法可以确保某些任务不会并行执行?
Is there any way to make sure certain tasks are not executed in parallel?
我正在编写一个 Celery 任务,它将 运行 对在 BitBucket 中创建的拉取请求进行一些测试。
我的问题是,如果在我的任务完成之前更新拉取请求,它将再次触发任务,因此我最终可以同时对同一个拉取请求进行两个任务 运行ning 测试。
有什么办法可以防止这种情况发生吗?并确保如果处理某些拉取请求的任务已经在进行中,那么我等待它完成然后再次开始处理它(从排队的新任务)
当我监控多个回购协议时,每个回购协议都有多个 PR,我希望如果一个事件来自不同的回购协议或不同的拉取请求来启动它并 运行 它。
如果我已经有来自同一个 repo 的同一个拉取请求,我只需要排队。
知道芹菜是否可行吗?
您正在寻找 mutex. For Celery, there is celery_mutex
and celery_once
。特别是,celery_once
声称正在按照您的要求进行操作,但我没有这方面的经验。
您还可以使用具有全局互斥实现的 Python multiprocessing
,或使用您已有的共享存储。
如果任务运行在同一台机器上,操作系统有锁定机制。
实现此目的的最简单方法是将工作线程并发设置为 1,以便一次只执行一个任务。
将任务路由到单独的队列。
your_task.apply_async(foo, queue='bar')
然后以 one
的并发启动你的 worker
celery worker -Q bar -c 1
另见 Celery - one task in one second
我正在编写一个 Celery 任务,它将 运行 对在 BitBucket 中创建的拉取请求进行一些测试。 我的问题是,如果在我的任务完成之前更新拉取请求,它将再次触发任务,因此我最终可以同时对同一个拉取请求进行两个任务 运行ning 测试。 有什么办法可以防止这种情况发生吗?并确保如果处理某些拉取请求的任务已经在进行中,那么我等待它完成然后再次开始处理它(从排队的新任务)
当我监控多个回购协议时,每个回购协议都有多个 PR,我希望如果一个事件来自不同的回购协议或不同的拉取请求来启动它并 运行 它。 如果我已经有来自同一个 repo 的同一个拉取请求,我只需要排队。
知道芹菜是否可行吗?
您正在寻找 mutex. For Celery, there is celery_mutex
and celery_once
。特别是,celery_once
声称正在按照您的要求进行操作,但我没有这方面的经验。
您还可以使用具有全局互斥实现的 Python multiprocessing
,或使用您已有的共享存储。
如果任务运行在同一台机器上,操作系统有锁定机制。
实现此目的的最简单方法是将工作线程并发设置为 1,以便一次只执行一个任务。
将任务路由到单独的队列。
your_task.apply_async(foo, queue='bar')
然后以 one
的并发启动你的 workercelery worker -Q bar -c 1
另见 Celery - one task in one second