计算队列等待时间

时间:2019-02-21 18:21:47

标签: asp.net .net vb.net multithreading queue

我希望根据您的队列位置来计算每个位置在队列中的等待时间或一般时间。这是一个FIFO。

服务当前性能状态列表

FirstSchema.statics.add_to = async function (_param) {
       //DO SOMETHING
       console.log('ayy');
       return true;
}

当前的处理和排队批处理文件列表。只列出当前的用户文件,这就是为什么缺少队列号的原因。

Size            AvTime  Queue Processing AvgFileSize(mb)
1 (0 - 1 mb)    2.57    18    3          0.21
2 (1 - 5 mb)    12.43   2     4          2.16
3 (5 - 10 mb)   23.38   9     8          6.72
4 (10 - 25 mb)  38.17   1     4          12.52
5 (>= 25 mb)    109.31  0     0          32.41

因此,我希望向列表中添加更多信息,直到队列中第20位的批处理文件在队列中等待之前需要等待多长时间。

Queue       Filename                Status
30          Batch (3456).XML(2)     Queue    
20          Batch (2399).xml(3)     Queue    
14          batch (1495).xml(1)     Queue    
12          batch (1497).xml(1)     Queue    
15          batch (1499).xml(1)     Queue    
10          batch (1500).xml(4)     Queue    
13          batch (1496).xml(1)     Queue    
11          batch (1501).xml(1)     Queue    
9           batch (1498).xml(1)     Queue    
8           batch (1494).xml(1)     Queue    
7           batch (1493).xml(1)     Queue    
6           batch (1492).xml(1)     Queue    
5           batch (1491).xml(1)     Queue    
4           batch (1490).xml(1)     Queue    
3           batch (1).xml(1)        Queue    
2           Batch1.xml(1)           Queue    
1           Batch1.XML(2)           Queue    
            Batch1.xml(1)           Processing   
            Batch1.xml(1)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(4)           Processing   
            Batch1.xml(1)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(4)           Processing   
            Batch1.xml(4)           Processing   
            Batch1.xml(2)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(2)           Processing   
            Batch1.xml(2)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(3)           Processing   
            Batch1.xml(4)           Processing   
            Batch1.xml(2)           Processing

1 个答案:

答案 0 :(得分:1)

您的问题并没有提供足够的背景信息来回答,但我可以根据您提供的示例显示做出一些猜测。

好像您有一个“单个队列,多个服务器”设置。换句话说,您只有一个FIFO队列,并且可以在任何给定时间处理一定数量的N个作业。是吗?

对于您的算法,假设您具有以下信息:

  • 我们的工作排在队列中(位置N表示前面有N个工作 我们的人)
  • 我们的工作规模
  • 队列中我们前面每个工作的大小
  • 正在处理的作业池,最大大小为N
  • 当前正在处理的每个作业的大小
  • 当前正在处理的每个作业的经过时间(自该作业开始以来的时间)

首先,您将需要一个ExpectedJobDuration(jobsize)函数,该函数根据“性能状态”表中显示的统计信息来计算给定大小的作业的预期作业处理时间。这看起来非常简单。给定工作大小,首先确定您属于五个大小类别中的哪一个(0:0-1mb,1:1-5mb等),然后计算您的工作大小,然后乘以平均时间除以平均大小该类别的工作。这将为您提供ExpectedJobDuration(jobsize)的估计值,它将告诉您在特定大小范围内的作业中,假设作业时间与作业大小成比例,则运行给定大小的作业需要多长时间。

现在,对于在给定时间ElapsedProcessingTime中已经处理过的给定大小的作业,我们希望完成多长时间?一个简单的答案将是这样的:

   ExpectedRemainingTime = ExpectedJobDuration(jobsize) - ElapsedProcessingTime.  

对于排在队列中的作业,这将与预期的作业持续时间完全相同;对于已经处理的作业,我们减去该作业已经投入工作的时间。但是,如果作业处理时间有一些随机变化,那是不完全正确的,并且可能变成负数。这有点像精算问题:一个人的平均寿命是X年,如果一个人已经是Y岁,我们期望他能活多久?您将需要更多的统计数据来进行计算,因此出于实际目的,如果答案是否定的,只需将其设置为零即可。 (如果某人年龄为100岁,并且平均寿命为90岁,那么他们会随时死亡。这不太正确,但是第一次近似就可以了。除非您是100岁的人,并且尚未准备好死。:-))

好的,现在我们有了一种方法来计算队列中每个前面的工作应该花费多长时间,以及完成已经在进行中的工作需要花费多长时间。

如果当前正在处理的作业数量少于N(在任何给定时间可以处理的最大值),那么我们的作业可以立即开始。因此,在这种情况下,我们有了答案-在开始工作之前的预期延迟为零秒。

现在让我们看一下我们在队列中处于位置0的情况。这意味着队列中没有前面的作业,因此我们的预期启动时间是处理池中作业的ExpectedRemainingTime的最小值。

现在,这为我们提供了一个递归函数的基础,该递归函数可计算直到我们预期的开始时间为止的延迟。

DelayUntilStart(jobPool, currentJob, queue) {
   find minJob in jobPool with minimum ExpectedRemainingTIme
   if currentJob is in position zero of queue
      return expectedRemainingTime(minJob)
   else
      remove minJob from jobPool
      pop the top job from the queue and put it in the jobPool      
      return ExpectedRemainingTime(minJob) + DelayUntilStart(jobPool, currentJob, queue)
   done
}  

注意-队列中可能还有很长的工作要做-但这并不意味着我们必须等待它完成。我们只需要等待它进入当前正在处理的作业池中,然后较短的作业就可以完成并让我们进入池中。

我刚刚描述的算法将是一个近似值。但是,如果没有大量有关作业处理时间的统计信息,您可能会得到与之相当的好。出于实际目的,我敢打赌它会很好地工作。