Python Celery:如何不按顺序加入任务结果?

时间:2019-02-20 20:16:17

标签: python asynchronous celery

我有一个简单的项目,其中我创建了一堆彼此不相关的工作,创建任务,将它们传递给Redis,并让大量工人分散在Docker Swarm的队列中, -正在运行的任务。工人完成后,他们将完成的工作转储到NFS共享中,并将文本值发送回Celery客户端。

我在asyncresult对象的结果集数组上使用celery.result.ResultSet的.join()函数。 join()包含一个回调(目前),该回调仅打印结果。

我的问题是join()块,直到它按照给定的顺序接收每个asyncresult值。我的团队由许多主机组成,这些主机是完全不同的机器,对我来说很重要的一点是,要在结果完成时返回结果,而不是按顺序排列或一旦完成就返回。

在任务完成时,是否可以通过Celery正确触发回调函数?我在网上看了很多示例,似乎我唯一的选择就是尝试使用asyncio运气,但是Python并不是我的强项。

用于创建任务和ResultSet obj的功能:

def populateQueue(encodeTasks):
r = ResultSet([])
taskHandles = {}

for task in encodeTasks:
    try:
        ret = encode.delay(task)
        r.add(ret)
        logging.debug("Task ID: " + str(ret.task_id))
        taskHandles[ret.task_id] = ret 
    except:
        logging.info("populateQueue fail: " + str(task.traceback))

logging.info("Tasks queued: " + str(len(taskHandles)))
return taskHandles, r

等待结果的main()的一部分:

        frameCountTotal = getFrameCount(targetFile)
        encodeTasks = buildCmdString(targetFile, frameCountTotal, clientCount)
        taskHandles, retSet = populateQueue(encodeTasks)

        logging.info("Waiting on tasks...")
        retSet.join(callback=testCallback)

预先感谢

1 个答案:

答案 0 :(得分:0)

找到了我自己的问题的答案:

ResultSet有另一个称为join_native()的方法,我认为只要代理是几种已知产品(RabbitMQ,Redis等)之一,它就会对代理使用更具体的API调用。 Celery的文档只是说,如果您满足经纪人的要求,它将提供更好的性能。文档没有说的是它允许乱序的回报(至少在Redis上,还没有尝试过RMQ)。