编程逻辑 - 在线程之间拆分任务

Par*_*roX 0 language-agnostic math programming-languages multiprocessing

假设你想要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)
Run Code Online (Sandbox Code Playgroud)

完成了总共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
Run Code Online (Sandbox Code Playgroud)

这也适用于任何数量的$NumTasks.

注意:请坚持回答手头的数学,避免暗示或假设情况.

Wil*_*ung 7

为什么?而不是预先确定调度顺序,将所有任务粘贴在队列上,然后让每个线程在准备好时逐个拉出它们.那么你的任务基本上会"尽快"运行.

如果你预先分配,那么一个线程可能正在进行特别长的处理并阻止其后面的所有任务的运行.使用队列,当每个任务完成并且线程释放时,它会抓取下一个任务并继续运行.

可以把它想象成一个银行,每个出纳员一行,一行和很多出纳员.在前者中,你可能会被困在存放硬币并逐一计数的人后面,后者你会到达下一个可用的出纳员,而PocketChange先生则算不上.