我正在尝试为我的应用程序创建某种管道。我有一个问题-应用程序的主要目标是读取视频,拍摄视频的第N个镜头,然后将其放入管道中。管道内部有5个不同的任务,例如:
1. Crop image
2. Store image in the array. if array length = IMAGES_NEEDED_FOR_TASK3, launch task 3
3. Apply some transforms to image, make one big image from IMAGES_NEEDED_FOR_TASK3,.
4. Stack transformed images in the array. if array length = IMAGES_NEEDED_FOR_TASK5, launch task 5
5. Write info about income images from task 4 to database
我很难解决任务2和4的实现,因为它们有条件。如果他们没有条件,我只会使用链方法。我考虑过从任务2调用任务3(我想为每个任务创建一个不同的队列),但是我读到这被认为是不好的做法。预先谢谢你
答案 0 :(得分:1)
用芹菜工作流程来表达这一点非常困难(如果这是您正在努力解决的问题),所以我建议您编写任务4,以便当堆栈具有IMAGES_NEEDED_FOR_TASK5图像时,它仅将任务#5排队(简单地说通过调用app.send_task()或app.apply_async())。
相同的任务#2。只要您不需要处理任务3和5的结果,就可以了,在这种情况下,逻辑变得更加复杂。如果Celery有一个原语可以简化这样的案例表达,那就太好了。
如果您仍然坚持使用Celery工作流程,那么您也许应该重新考虑逻辑,并利用Chunk primitive的优势。在这种情况下,您的任务2将为add.chunks()
。任务5也是如此。