编程逻辑-在线程之间分配任务
|
假设您要5个线程同时处理数据。还假设您有89个任务要处理。
最终,您知道89/5 = 17,余数为4。最好的拆分任务的方法是让4个(余数)线程分别处理18(17 + 1)个任务,然后再拥有1(#个线程-余数)线程以处理17。
这将消除其余部分。只是为了验证:
Thread 1: Tasks 1-18 (18 tasks)
Thread 2: Tasks 19-36 (18 tasks)
Thread 3: Tasks 37-54 (18 tasks)
Thread 4: Tasks 55-72 (18 tasks)
Thread 5: Tasks 73-89 (17 tasks)
共完成89个任务。
我需要一种数学上/可编程性上获取每个线程的起始和终止范围的方法;下面应该打印出我上面列出的确切内容:
$NumTasks = 89
$NumThreads = 5
$Remainder = $NumTasks % $NumThreads
$DefaultNumTasksAssigned = floor($NumTasks / $NumThreads)
For $i = 1 To $NumThreads
if $i <= $Remainder Then
$NumTasksAssigned = $DefaultNumTasksAssigned + 1
else
$NumTasksAssigned = $DefaultNumTasksAssigned
endif
$Start = ??????????
$End = ??????????
print Thread $i: Tasks $Start-$End ($NumTasksAssigned tasks)
Next
这也适用于任何数量的$NumTasks
。
注意:请坚持回答当前的数学问题,并避免提出建议或假设情况。
没有找到相关结果
已邀请:
3 个回复
扑北爱
... 如果您只想分配一次任务,请使用以下公式代替?????????按照您的逻辑,应该做到这一点:
公式说明如下: 1是因为您的显示/逻辑是基于1而不是基于0的事实 第二项是因为我们通常在每次迭代中添加($ DefaultNumTasksAssigned + 1)。 第三项提供对最后几次迭代的更正。 它的第一部分,
提供0,直到$ i到达第一个线程 不会再执行一项任务,此后再执行一项。 第二部分表示我们需要纠正多少。 $ End的公式更简单,唯一的窍门是减1,这是因为Start和End值是包含在内的(例如,在1到19之间,有19个任务而不是18个) 以下略作修改的逻辑也应该起作用,它通过保留$ Start变量的运行选项卡而不是每次都重新计算来避免\“ fancy \”公式。
这是上面的Python转录
嫩昧竞莫
貉骂