Why
其实这种需求很常见 。在跑仿真的时候,为了得到多组数据以供统计分析比对,我们需要将一些程序按照不同参数配置运行多次。为了利用现代计算机的多核性能,我们常常以多进程的方式来运行这些仿真程序以最大化利用硬件资源。
这是我开始使用huey的时候的需求,但是事实上huey的应用远不止于此。和celery类似,你可以把huey用来管理和调度异步任务,或者是用来运行周期性任务以及定时服务。
我最开始的方法是写了一个工具脚本,在这个脚本内部开了一个线程池,然后在将计算任务提交给这个线程池。但是这样有一个问题:如果我已经开始了一组计算任务,而我又希望再增加一组任务,我只能等前一组任务完全结束之后才能再开始下一组。不然前后两组任务会同时开始运行,争抢计算资源,而不是按照我设想的任务的队列的模式。
设想一个具体的例子。我的计算机是8核的,而我的一组计算任务需要以不同的参数运行16次。通过在进程内创建一个8线程容量的线程池,我可以让这16个任务进入队列序次执行,同时执行的现成数不超过8。倘若前一次的16个任务还剩余4个未运行,而我又要再增加16个计算任务,此时以这种模式,我无法将新增的任务放到前一个进程的任务队列里。如果直接强行运行,则会导致前一组任务的4个线程在运行,而后一个任务会调度出8个线程,总计12个线程,这并不能最优地使用多核。
那么这个时候我就需要一个任务队列系统来管理我的计算任务了:每次我要运行一组任务的时候,我将计算任务提交给任务队列系统,由这个系统来调度worker(worker的数量常常设定为CPU的线程数)执行。简而言之,任务队列系统提供了跨进程的队列。
其实之前我用过celery这个任务队列框架,