4

任务并行库和 TPL 数据流允许指定最大并行度。该值是一个上限,而不是保证。实际上,TPL 将根据包括系统资源在内的许多因素确定实际并行度,而不会超过任何程序员指定的最大值。

是否有某种机制可以确定 TPL 在某个时间点对并行度所做的选择?

我之所以这么问,是因为我移植了一些相当复杂的代码来使用 TPL Dataflow,并且整体吞吐量远低于原始代码。我想看看 TPL 代表我做出了哪些选择,以了解它为什么慢得多。

4

1 回答 1

3

我遇到了和你非常相似的情况。我最终使用我的日志数据来大致告诉我每分钟使用了多少线程。这给了我一个粗略的数字,但并不准确。

我不相信 TPL 可以为您提供有关线程使用的遥测。如果你想实现更精确的东西,我建议在每个任务/线程中实现逻辑,以标记它开始时间和结束时间的一些共享列表。这是我将如何开始的示例。

public class DoSomeTPLWork
{
    public static void Start()
    {
        List<int> numberList = Enumerable.Range(1, 1000).ToList();

        Parallel.ForEach(numberList, number =>
            {
                ThreadTracking.ThreadStarted();

                int square = number * number;
                Console.WriteLine("Square of {0} is {1}", number, square);

                ThreadTracking.ThreadFinished();
            }
        );

        var threadInfo = ThreadTracking.GetThreadInfo();
    }
}

public class ThreadTracking
{
    private static ConcurrentBag<ThreadInfo> _threadInfo = new ConcurrentBag<ThreadInfo>();

    public static void ThreadStarted()
    {
        var threadInfo = new ThreadInfo(Thread.CurrentThread.ManagedThreadId);
        threadInfo.Start();
        _threadInfo.Add(threadInfo);
    }

    public static void ThreadFinished()
    {
        var threadInfo = _threadInfo.Where(ti => ti.ThreadId == Thread.CurrentThread.ManagedThreadId && !ti.Complete).SingleOrDefault();
        if(threadInfo != null)
        {
            threadInfo.Stop();
        }
    }

    public static List<ThreadInfo> GetThreadInfo()
    {
        return _threadInfo.ToList();
    }
}

public class ThreadInfo
{
    public bool Complete { get; set; }
    public int ThreadId { get; set; }
    public DateTime? TimeStarted { get; set; }
    public DateTime? TimeFinished { get; set; }

    public ThreadInfo(int threadId)
    {
        ThreadId = threadId;
    }

    public void Start()
    {
        TimeStarted = DateTime.Now;
        Complete = false;
    }

    public void Stop()
    {
        TimeFinished = DateTime.Now;
        Complete = true;
    }
}

使用这些数据,您可以通过添加更多方法来查询数据或在 Excel 中将其弹出以使用它来查看在任何给定的秒内使用了多少线程。

于 2012-11-12T22:34:22.903 回答