Tom*_*Tom 8 .net c# queue concurrency multithreading
我有两个主题.一种是从串行端口收集数据并将其放入一个数组中,然后将其添加到并发队列中.另一个线程是采用这些数组并实时绘制数据.每秒大约有150个数据包,每个50字节.我遇到的问题是,当它运行时,它消耗大约10%的CPU.这是一个非常快速的核心I7 Haswell.如果我在消费线程中添加Thread.Sleep(1),则CPU利用率降至1%.问题是如果我把它放在Thread.Sleep(2)然后数据包不再同步.所以这不是一个解决方案,如果它在较慢的计算机上运行,它可能无法正常工作.
代码很简单.这是生产者线程:
static void FillQueue(byte[] buffer)
{
dataQueue.Enqueue(buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是消费者线程:
while (continuePolling)
{
Thread.Sleep(1); //if removed, there is 10% CPU utilization. If higher then packet synchronization is lost.
if (dataQueue.TryDequeue(out result))
{
ProcessPacket(result);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这很难理解,因为ProcessPacket方法执行大约需要0.3毫秒,并且每秒调用大约10秒.
我现在尝试使用阻塞集合.这是制片人
BlockingCollection<byte[]> dataQueue = new BlockingCollection<byte[]>;
public static void addData(buffer)
{
dataQueue.add(buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是消费者
while (dataQueue.TryTake(out result)
{
ProcessPacket(result);
}
Run Code Online (Sandbox Code Playgroud)
完全没有区别!它使用10%的CPU,如果我添加一个Thread.Sleep(1)是好的,但Thread.Sleep(2)和我丢失的数据包我得不到它.每个数据包中有50个字节.而已.它们的消耗速度和生产速度一样快.谢谢
Evk*_*Evk 10
那是因为你基本上有while (true) {}循环.ProcessPacket需要0.3毫秒,每秒有10个数据包,因此每秒3毫秒的有用工作量.剩余的997ms你的循环不断检查队列中是否有新项目,浪费你的CPU资源.
而是BlockingCollection与队列一起使用,这对您的任务有更好的选择.它支持阻塞出队(必要时带有超时和取消令牌),所以不要浪费CPU:
var dataQueue = new BlockingCollection<string>(new ConcurrentQueue<string>());
// Add instead of Enqueue
dataQueue.Add("some item");
// Take instead of Dequeue, this will block until item is available in queue
var result = dataQueue.Take();
// blocks until item is available or timeout happens
if (dataQueue.TryTake(out result, TimeSpan.FromMilliseconds(100)))
Run Code Online (Sandbox Code Playgroud)
它还支持"流"接口,因此您的代码可以只是:
foreach (var result in dataQueue.GetConsumingEnumerable()) {
ProcessPacket(result);
}
Run Code Online (Sandbox Code Playgroud)
而不是continuePolling标志 - 呼叫
dataQueue.CompleteAdding();
Run Code Online (Sandbox Code Playgroud)
当没有预期的项目时(因此,否则您将设置continuePolling为false) - 这将GetConsumingEnumerable完成提供项目并返回.
| 归档时间: |
|
| 查看次数: |
3409 次 |
| 最近记录: |