我第二次将哈尔顿的话。您可以一次只给一个任务提供一个任务(或者一次执行几个任务,具体取决于是否有大量开销,即,相对于启动/回收线程的成本,个别任务通常以非常快的速度完成)。你的后续评论有效地解释了你的“线索”带来了巨大的创造成本,因此你希望尽可能多地为它们提供一次工作,而不是浪费时间创造新的“线程”,每个线程都需要少量的工作。
反正...要去math question
...
如果你想分配任务只有一次,下面的公式,插代替的了?????????在你的逻辑,应该做的伎俩:
$Start = 1
+ (($i -1) * ($DefaultNumTasksAssigned + 1)
- (floor($i/($Remainder + 1)) * ($i - $Remainder))
$End = $Start + $NumTasksAssigned -1
的公式如下解释:
1是一个事实,即显示器/逻辑是一个基于不从零开始
第二项是因为我们通常在每次迭代中添加($ DefaultNumTasksAssigned + 1)。
第三项为前几次迭代提供了一个修正。
它的第一部分,(floor($i/($Remainder + 1))
提供0至$我到达的第一个线程
不接受一个额外的任务,此后1。
第二部分表达了我们需要纠正多少。
为$结束的公式是更加容易,唯一的招是减1,这是因为开始值和结束值是包含性的(因此,例如,1之间的19有19个任务不是18)
的以下逻辑的稍微修改一块也应该工作,避免了通过保持$开始变量的运行选项卡,而不是每次都重新计算它的“神奇”的公式..
$NumTasks = 89
$NumThreads = 5
$Remainder = $NumTasks % $NumThreads
$DefaultNumTasksAssigned = floor($NumTasks/$NumThreads)
$Start = 1
For $i = 1 To $NumThreads
if $i <= $Remainder Then // fixed here! need <= because $i is one-based
$NumTasksAssigned = $DefaultNumTasksAssigned + 1
else
$NumTasksAssigned = $DefaultNumTasksAssigned
endif
$End = $Start + $NumTasksAssigned -1
print Thread $i: Tasks $Start-$End ($NumTasksAssigned tasks)
$Start = $Start + $NumTasksAssigned
Next
这里是上面的一个Python转录
>>> def ShowWorkAllocation(NumTasks, NumThreads):
... Remainder = NumTasks % NumThreads
... DefaultNumTasksAssigned = math.floor(NumTasks/NumThreads)
... Start = 1
... for i in range(1, NumThreads + 1):
... if i <= Remainder:
... NumTasksAssigned = DefaultNumTasksAssigned + 1
... else:
... NumTasksAssigned = DefaultNumTasksAssigned
... End = Start + NumTasksAssigned - 1
... print("Thread ", i, ": Tasks ", Start, "-", End, "(", NumTasksAssigned,")")
... Start = Start + NumTasksAssigned
...
>>>
>>> ShowWorkAllocation(89, 5)
Thread 1 : Tasks 1 - 18 (18)
Thread 2 : Tasks 19 - 36 (18)
Thread 3 : Tasks 37 - 54 (18)
Thread 4 : Tasks 55 - 72 (18)
Thread 5 : Tasks 73 - 89 (17)
>>> ShowWorkAllocation(11, 5)
Thread 1 : Tasks 1 - 3 (3)
Thread 2 : Tasks 4 - 5 (2)
Thread 3 : Tasks 6 - 7 (2)
Thread 4 : Tasks 8 - 9 (2)
Thread 5 : Tasks 10 - 11 (2)
>>>
>>> ShowWorkAllocation(89, 11)
Thread 1 : Tasks 1 - 9 (9)
Thread 2 : Tasks 10 - 17 (8)
Thread 3 : Tasks 18 - 25 (8)
Thread 4 : Tasks 26 - 33 (8)
Thread 5 : Tasks 34 - 41 (8)
Thread 6 : Tasks 42 - 49 (8)
Thread 7 : Tasks 50 - 57 (8)
Thread 8 : Tasks 58 - 65 (8)
Thread 9 : Tasks 66 - 73 (8)
Thread 10 : Tasks 74 - 81 (8)
Thread 11 : Tasks 82 - 89 (8)
>>>
来源
2011-06-18 01:02:21
mjv
为什么你想要5个线程同时处理?这似乎是一个非常奇怪的数字,只是拉出空气。 –