- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Stephen Toub 的书第 88 页
http://www.microsoft.com/download/en/details.aspx?id=19222
有代码
private BlockingCollection<T> _streamingData = new BlockingCollection<T>();
// Parallel.ForEach
Parallel.ForEach(_streamingData.GetConsumingEnumerable(),
item => Process(item));
// PLINQ
var q = from item in _streamingData.GetConsumingEnumerable().AsParallel()
...
select item;
然后斯蒂芬提到
"when passing the result of calling GetConsumingEnumerable as the data source to Parallel.ForEach, the threads used by the loop have the potential to block when the collection becomes empty. And a blocked thread may not be released by Parallel.ForEach back to the ThreadPool for retirement or other uses. As such, with the code as shown above, if there are any periods of time where the collection is empty, the thread count in the process may steadily grow;"
我不明白为什么线程数会增加?
如果集合为空,那么 blockingcollection 不会请求任何进一步的线程吗?
因此您不需要执行 WithDegreeOfParallelism 来限制 BlockingCollection 上使用的线程数
最佳答案
线程池有一个爬山算法,用于估计合适的线程数。只要增加线程会增加吞吐量,线程池就会创建更多的线程。它将假设发生了一些阻塞或 IO,并尝试通过遍历系统中的处理器数量来使 CPU 饱和。
这就是为什么在线程池线程上执行 IO 和阻塞操作可能很危险。
这是上述行为的完整示例:
BlockingCollection<string> _streamingData = new BlockingCollection<string>();
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 100; i++)
{
_streamingData.Add(i.ToString());
Thread.Sleep(100);
}
});
new Thread(() =>
{
while (true)
{
Thread.Sleep(1000);
Console.WriteLine("Thread count: " + Process.GetCurrentProcess().Threads.Count);
}
}).Start();
Parallel.ForEach(_streamingData.GetConsumingEnumerable(), item =>
{
});
虽然吞吐量没有增加,但我不知道为什么线程数一直在攀升。根据我解释的模型,它不会增长。但我不知道我的模型是否真的正确。
也许线程池有一个额外的启发式方法,如果它看不到任何进展(以每秒完成的任务来衡量),它就会生成线程。这是有道理的,因为这可能会防止应用程序中出现很多死锁。如果重要任务因等待现有任务退出并使线程可用而无法运行,则可能会发生死锁。这是线程池的一个众所周知的问题。
关于c# - 流式数据 BlockingCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9045028/
我有两个阻塞集合 - 一个优先级高于另一个。如果我使用 TryTakeFromAny 并首先指定更高优先级的 BlockingCollection,是否可以保证首先查看更高优先级的队列? 最佳答案 这
我有一个使用 BlockingCollection<> 实现的下载队列.现在我想偶尔优先考虑一些下载。我认为将某些元素“向上”移动到集合中可能会很棒,例如在列表中,但没有像 Remove()/AddF
BlockingCollection.Dispose实际上做什么? 最佳答案 这样可以正确处理内部等待 handle 。 BlockingCollection在内部使用一对事件等待句柄,它们又具有关联
BlockingCollection blockingCollection = new BlockingCollection(); // create and start a producer
将来自多个线程的消息放到一个队列中并让一个单独的线程一次处理一个队列中的项目的最佳方法是什么? 在尝试断开多个线程的事件时,我经常使用这种模式。 我正在为此使用 BlockingCollection,
我正在尝试正确建模多线程单生产者/多消费者场景,其中消费者可以要求生产者获取元素,但生产者需要执行耗时的操作来生产它(想想执行查询或打印文档)。 我的目标是确保没有消费者可以同时要求生产者生产一件商品
我知道使用 ConcurrentQueue 的 BlockingCollection 的 boundedcapacity 为 100。 但是我不确定那是什么意思。 我正在尝试实现一个并发缓存,如果队列
BlockingCollection 仅包含添加单个项目的方法。如果我想添加一个集合怎么办?我应该只使用 foreach 循环吗? 为什么 BlockingCollection 不包含添加集合的方法?
我正在编写一个 WCF 服务,它从多个模块(数据库、其他服务..)接收通知并将它们添加到阻塞集合中,以便在将相关数据发布到客户端的使用者线程上进行处理。 客户端可以请求存储在服务器上的完整数据,在此操
我有这样一种情况,我需要有大量(数百个)队列,其中的项目应该按顺序处理(需要单线程消费者)。我的第一个实现,based on the samples,我为每个 BlockingCollection 使
Stephen Toub 的书第 88 页 http://www.microsoft.com/download/en/details.aspx?id=19222 有代码 private Blockin
我即将使用如下所示的 BlockingCollection,只是想检查它是否适合线程安全等。想知道我是否需要 CancellationTokenSource。 谢谢 public class MyAp
你好,我正在尝试创建一个使用流数据的应用程序......(所以没有结束......完成......等) 由于它的性质,因为流数据得到了很多操作,我使用 BlockingCollection,它工作得很
我有一个 BlockingCollection .生产者任务向其中添加项目,消费者任务移除项目。 现在我想限制集合中的项目数量,如果添加了更多项目,则自动丢弃旧数据。该集合不应同时包含超过 N 个最近
我有一个线程将项目添加到 BlockingCollection 。 在我正在使用的另一个线程上foreach(myCollection.GetConsumingEnumerable() 中的 var
我有一个程序如下 class Program { public static int TaskCount { get; set; } public stati
我有以下代码,其中包含一个生产者线程和多个消费者线程。你知道多个消费者是否是线程安全的。例如,线程 1 是否有可能正在消费,而线程 2 是否并行消费并更改线程 1 中使用的项目的值? namespac
我需要建立一个阻塞优先级队列,我的预感是 TakeFromAny 可能是 secret 成分,但是关于该方法的文档很少。它的目的/适当用途是什么? 我的要求是多个线程将添加到高优先级或低优先级队列中。
有没有办法删除 具体 BlockingCollection 中的项目,如下所示: IMyItem mySpecificItem = controller.getTopRequestedItem();
我试图在.NET 4上新的Parallel Stacks的背景下理解BlockingCollection的目的。 MSDN文档说: BlockingCollection用作IProducerConsu
我是一名优秀的程序员,十分优秀!