我有一个简单的项目,其中我创建了一堆彼此不相关的工作,创建任务,将它们传递给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)
预先感谢
答案 0 :(得分:0)
找到了我自己的问题的答案:
ResultSet有另一个称为join_native()的方法,我认为只要代理是几种已知产品(RabbitMQ,Redis等)之一,它就会对代理使用更具体的API调用。 Celery的文档只是说,如果您满足经纪人的要求,它将提供更好的性能。文档没有说的是它允许乱序的回报(至少在Redis上,还没有尝试过RMQ)。