我想讨论并行app.post('/user', [
check.query('username')
], (req, res) => {
//your code
});
处理的不同方法。
实施1,使用queue
和BlockingCollection
:
Task.Parallel
在这里我读到private BlockingCollection<Item> _collection = new BlockingCollection<Item>();
Void StartQueue()
{
Task.Factory.StartNew(async (s) =>
{
var partitioner = Partitioner.Create(_collection.GetConsumingEnumerable(token), EnumerablePartitionerOptions.NoBuffering);
Parallel.ForEach(partitioner, parallelOptions, async item =>
{
..process(item);
});
}, new System.Threading.CancellationToken(), TaskCreationOptions.LongRunning);
}
void EnqueItem(Item item)
{
_collection.Add(item);
}
和BlockingCollection
都使用了锁,这使得它们不能很好地协同工作。
实施2,使用Task.Parallel
和ConcurrentQueue
:
Task.Parallel
实施3,使用private ConcurrentQueue<Item> _queue = new ConcurrentQueue<Item>();
Void StartQueue()
{
Task.Factory.StartNew(async (x) =>
{
while (true)
{
var partitioner = Partitioner.Create(_queue, EnumerablePartitionerOptions.NoBuffering);
Parallel.ForEach(partitioner, parallelOptions, async item =>
{
..process(item);
})
Task.Delay(TIMEOUT_MS);
}
;
}, new System.Threading.CancellationToken(), TaskCreationOptions.LongRunning);
}
void EnqueItem(Item item)
{
_queue.Enqueue(item);
}
和BlockingCollection
:
SemaphoreSlim
您如何看待此实现,并且该任务有更好的实现。