python – 用于检查正在运行的任务的Celery快速事件循环?

#ready is populated with some obj
ready = set()
running = []
while ready or running:
    #send all tasks in ready
    while ready:
        #send celery task
        t = ready.pop()
        res = add.delay(t)
        running[res] = t

    while running:
         if breakout:
             break

         for run in running.iterkeys():
             if run.ready():
                 rtask = running[run]
                 result = run.get(interval=0.00001)
                 # put dependent tasks into ready
                 if rtask.depends:
                     for t in rtask.depends:
                         ready.add(t)

                 del running[run]
                 # we have tasks in ready now so break out of running and send out ready jobs
                 breakout = True
                 break

随着任务变得越来越大,我的代码花了太多时间检查运行任务是否有意义,因为它是O(N)

是否有更快的方法来检查发送给芹菜工人的任务是否完成?

最佳答案 为什么你真的需要检查运行任务?你可以创建一个在任务完成时做某事的逻辑.例如,你可以做装饰.

此外,如果您仍想维护任务列表 – 我建议使用映射(dict)而不是列表.每个任务都有uuid,可以映射到该值(例如,True).它将有助于检查任务是否正在运行 – 更快,并且仍然能够迭代密钥.此外,它允许通过指定False值轻松删除项目,然后在下一次迭代时删除项目(而不是在所有任务完成时进行突破和N *(N-1)操作.

点赞