簡體   English   中英

PLINQ WithDegreeOfParallelism延遲?

[英]PLINQ WithDegreeOfParallelism Delay?

我想同時在多個對等節點上執行基於網絡的任務(可能會超時)。

所以我有以下代碼:

Parallel.ForEach(hosts, i => SomeLongRunningNetworkTask(i));

我注意到從第六個任務開始的執行被延遲了大約1秒鍾。

所以我將代碼更改為:

hosts.AsParallel()
                .WithDegreeOfParallelism(64)
                .ForAll(i => result.Add(SomeLongRunningNetworkTask(i)));

但結果是一樣的。

輸出(在四核上):

Start: 44,00 ms
Start: 44,00 ms
Start: 44,00 ms
Start: 44,00 ms
Start: 44,00 ms
Start: 1025,06 ms
Start: 2024,12 ms
Start: 3024,17 ms
Start: 4024,23 ms
Start: 5024,29 ms
...

有沒有一種簡單的方法可以使用PLINQ而不出現這種怪異的行為,還是我錯過了一些東西?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplicationParallelTest
{
    class Program
    {
        private DateTime Started { get; set; }

        static void Main(string[] args)
        {
            // for testing: All Subnet IP's: 
            var ips = new List<IPAddress>();
            for(int i=1 ; i< 255 ;i++)
                ips.Add( IPAddress.Parse( "192.168.10." + i ));

            var result = new Program().ExecuteAll(ips);
        }

        private List<Object> ExecuteAll(List<IPAddress> hosts)
        {
            Started = DateTime.Now;
            var result = new List<Object>();

            //Parallel.ForEach(hosts, i => SomeLongRunningNetworkTask(i));
            hosts.AsParallel()
                .WithDegreeOfParallelism(64)
                .ForAll(i => result.Add(SomeLongRunningNetworkTask(i))
                );

            return result;
        }

        private Object SomeLongRunningNetworkTask(Object o)
        {
            Console.WriteLine("Start: " + DateTime.Now.Subtract(Started).TotalMilliseconds.ToString("F2") + " ms");
            Thread.Sleep(60 * 1000);
            Console.WriteLine("End: " + DateTime.Now.Subtract(Started).TotalMilliseconds.ToString("F2") + " ms");
            return new Object();
        }
    }
}

當您的線程調用Thread.Sleep它們正忙於等待並且無法處理其他主機。 我的猜測是ThreadPool意識到它需要更多的資源並繼續創建更多線程。

ThreadPool.SetMinThreads設置為更大的數字后,請嘗試運行測試。

編輯:@henk評論。 這幾乎從來不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM