我第二次將哈爾頓的話。您可以一次只給一個任務提供一個任務(或者一次執行幾個任務,具體取決於是否有大量開銷,即,相對於啓動/回收線程的成本,個別任務通常以非常快的速度完成)。你的後續評論有效地解釋了你的「線索」帶來了巨大的創造成本,因此你希望儘可能多地爲它們提供一次工作,而不是浪費時間創造新的「線程」,每個線程都需要少量的工作。
反正...要去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個線程同時處理?這似乎是一個非常奇怪的數字,只是拉出空氣。 –