我有一个程序,它对大图像进行大量计算,显然它只能处理系统RAM允许的那么多请求。
我使用Celery+Redis对这些长任务进行排队,并想知道是否有任何方法可以指示Celery在开始新任务之前先检查RAM可用性(但仍要让它们排队(?某种类型的锁会在RAM被完成的任务释放后打开?
我很乐意接受任何建议或方向。
这可以使用芹菜检查来解决
以检索集群状态和总体内存占用。
结合重试或确认延迟
这个想法
当任务启动时,可以查询集群(或外部服务(以检索所有内存占用信息:
# example
from celery import Celery
app = Celery(...)
app.control.inspect().active()
它为每个可用的工作人员返回大量信息。
之后,您应该应用某种基于内存的规则,然后继续计算或决定释放处理:
# example
@celery.task(bind=True)
def task(self, *args, **kwargs):
if is_there_enought_memory():
do_stuff()
else:
time.sleep(...)
self.retry(...)
当不满足最低要求时,任务会等待一定的时间并重新安排任务本身。