Tin*_*ino 5 python queue task multiprocessing
我们根据用户输入(称为“系统”)对地理数据进行了一些计算。有时一个系统需要10个位置来进行计算,有时需要1000多个位置。一个位置大约需要1秒钟来计算,希望我们将来可以加快速度。目前,我们通过在Celery工作者中使用Pool(来自billiard)多处理来实现此目的。这样做的原因是它100%地利用了所有内核,但是存在两个问题:
pipe可能与子进程有关)会导致工作人员在达到最大打开文件数限制时挂起(已调查,但在工作一天以上后仍未找到解决方案)为了解决这些问题,我可以将每个计算作为单独的Celery任务运行。但是,我们还希望为我们的用户“合理地”安排这些计算,以便:
使用小型系统(例如<50个位置)的用户不必等到大型系统(> 1000个位置)完成。系统越大,对用户而言增加的等待时间就越少(无论如何,他们正在做其他事情,并且可以获得通知)。因此,这类似于加权公平排队 。
我找不到能够实现这种优先级排序的分布式任务运行器。我想念一个吗?我查看了Celery,RQ,Huey,MRQ,Pulsar Queue等,以及诸如Luigi和Pinball之类的数据处理管道,但似乎没有一个能够轻松实现这一点。
其中大多数建议通过为更高优先级的队列添加更多工作器来创建优先级。但是,这将不起作用,因为工作人员将开始争取CPU时间。(RQ通过先清空完整的第一个传入队列,然后再移动到下一个队列来做不同的操作)。
我想可以运行一个多处理程序,每个CPU有一个进程,以WFQ方式从多个Redis列表中获取,每个Redis列表都是一个特定的队列。
这是正确的方法吗?当然,要使队列配置具有动态性(例如,也将其存储在Redis中,并在每对已处理的任务中重新加载它),并进行事件监视以获取洞察力,还有很多工作要做。
其他想法:
还有其他建议吗?