什么是在Producer / Consumer中处理无限任务的最有效方法?

时间:2015-04-19 07:31:50

标签: c# concurrency producer-consumer

我在云队列(Azure)中有数千兆字节的数据(存储在消息中,每条消息大约为500KB),数据不断涌现。

我需要对每条消息进行一些处理。我决定创建2个后台工作程序,一个用于将数据存入内存,另一个用于处理该数据:

GetMessage(CloudQueue cloudQueue, LocalQueue localQueue)
{
    lock (localQueue)
    {
        localQueue.Enqueue(cloudQueue.Dequeue());
    }
}

ProcessMessage(LocalQueue localQueue)
{
    lock (localQueue)
    {
        Process(localQueue.Dequeue());
    }
}

问题是数据永远不会停止,所以我将花费大量时间来同步本地队列。这类问题是否存在已知模式?

1 个答案:

答案 0 :(得分:3)

您在处理

时不需要按住锁定
Item i;
lock (localQueue)
{
    i = localQueue.Dequeue();
}
Process(i);
因此,应该没有什么争论。如有必要,通过批量插入来降低生产者获取入队锁的频率:而不是队列保持单个项目使其保持批次。您可以通过一个因子(平均批量大小)有效地减少锁定数量。您可以拥有一个简单的批处理模型,例如,每10个或按时间或某个时间和阈值的组合。