我有一個像[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
這樣的有序列表。我將它傳遞給Parallel.ForEach
聲明。我可以以某種方式實現以下執行存儲桶的順序:處理前3個項目[1, 2, 3]
,其中存儲桶本身的排序不是必需的,例如可以是[2, 1, 3]
。然後處理下3項[4, 5, 6]
等?有序並行執行
有序並行執行
回答
我不確定您是否可以直接進行此操作。但我建議您將輸入列表分成較小的列表,然後您可以使用Parallel.Foreach
處理每個子列表。
List<int> fruits = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<List<int>> ls = new List<List<int>>();
for (int i = 0; i < fruits.Count; i += 3)
{
ls.Add(fruits.GetRange(i, Math.Min(3, fruits.Count - i)));
}
foreach (List<int> group in ls)
{
Parallel.ForEach(group, fruit =>
{
});
}
3是小列表的長度。
你確定這會起作用嗎?讓我試試 –
@GiorgiNakeurl我將會建議一些類似的東西 - 請記住,Parallel.ForEach的Microsoft文檔明確聲明它們不保證特定的執行順序,所以你幾乎不得不做這樣的事情。 – EJoshuaS
嗯,這個工程。我想試試這個,但我不相信它會工作:) –
即使接受的答案完全符合要求,它也會有一些開銷。首先,當我們談論TPL時,數據陣列的體積可能很大,所以簡單地創建這麼多的陣列非常耗費內存。
此外,@viveknuna建議的解決方案不保證塊的順序。如果它是好的,你應該使用來自@DmitryBychenko答案的小更新:
const int chunkSize = 3;
var array = Enumerable.Range(1, 9).ToArray();
// get the chunks for indexes for array sized in group of 3
var partitioner = Partitioner.Create(0, array.Length, chunkSize);
// use all the system resources
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
// use the partitioner for a chunks, so outer parallel foreach
// will start a task for all the chunks, [1, 2, 3], [4, 5, 6], [7, 8, 9]
Parallel.ForEach(partitioner, parallelOptions, part =>
{
// inner foreach will handle part of the chunk in parallel
Parallel.ForEach(array.Skip(part.Item1).Take(chunkSize), parallelOptions, value =>
{
// handle the array value in parallel
});
});
在給定的代碼,如果你設置了ParallelOptions.MaxDegreeOfParallelism
到1
,你會得到期望的有序並行執行,塊大塊。
謝謝,明天我會試一試。 –
- 1. 並行執行
- 2. 並行執行
- 3. Parallel.ForEach有序執行
- 4. 在包中並行執行程序
- 5. c#並行執行應用程序
- 6. 如何並行執行子程序?
- 7. 防止程序並行執行
- 8. C程序中的並行執行
- 9. 並行執行編輯而不是按順序執行編輯
- 10. 並行執行每個循環的順序執行
- 11. 並行執行C#
- 12. TestNG並行執行
- 13. 並行Maven執行
- 14. Cuda並行執行
- 15. 執行功能,有條件和並行
- 16. 並行不會執行所有記錄
- 17. 並行執行具有不同參數的相同Python程序
- 18. 併發執行
- 19. 相互執行併發執行程序的問題
- 20. OpenCL程序沒有執行
- 21. 執行並行線程池
- 22. Appium - 並行執行(Grid)
- 23. 並行執行方法
- 24. 並行執行oracle PL/SQL
- 25. 並行執行的的AsyncTask
- 26. RxJava並行執行問題
- 27. 調用setInterval並行執行
- 28. 並行執行方案
- 29. 並行執行多個AsyncTask
- 30. Python連續並行執行
你是說你想洗牌每批3個元素? – tinstaafl
不,我說的是批量訂購:前3個,然後是下3個,但裏面的訂單可能是隨機的 - 不是強制性的在水桶內訂購 –