gpt4 book ai didi

c# - 基于任务的编程与应用程序的多个实例具有相同的效率

转载 作者:行者123 更新时间:2023-11-30 18:30:46 24 4
gpt4 key购买 nike

我创建了一个 Windows 服务,它使用来自 RabbitMq 的消息。消费以异步方式完成,消息被推送到服务。

它可以很好地水平缩放,大约有一个。线性性能提升,即使只是在同一台服务器上创建更多服务实例。由于我们对吞吐量有明确的目标,我发现通过简单地在 Windows 服务中创建 n 个任务而不是部署 n 个服务实例来控制扩展更简单、部署更明智。

重写 windows 服务以简单地启动 n 个任务,每个任务运行“MQ 消费”代码,因此本质上做的是 windows 服务的多个实例所做的,不会产生相同的性能,实际上根本没有性能增益,实际上似乎在代码执行上有更大的开销!。

我知道存在时间安排问题,但底线问题是。是否有可能使用任务并获得与启动应用程序的多个实例“大致”相同的性能?如果是这样,实现会是什么样子,因为我当前的设置扩展性很差。

一些代码片段:

这是基本的任务创建,其中每个任务都有一个 taskwrapper 实例,它基本上是对消费和处理消息的整个业务逻辑的抽象:

public void Start()
{
for (var i = 0; i < _levelOfConcurrency; i++)
{
var task = Task.Factory.StartNew(() => new TaskWrapper().TaskRun(_cancelationTokenSource.Token,_sleeptime),
TaskCreationOptions.LongRunning);
_tasks[i] = task;
Console.WriteLine("Task created {0}", i);
}
}

public void Stop()
{
_cancelationTokenSource.Cancel();
Task.WaitAll(_tasks);
}

这是每个任务在 taskwrapper 类中运行循环中的基本内容:

public void TaskRun(CancellationToken cancellationToken,TimeSpan sleeptime)
{
_semaphoreDataController.Start(); // Process messages async, fully selfcontained/threaded

//Keep alive and occasionally check if cancelation is requested
while (!cancellationToken.IsCancellationRequested)
{
Thread.Sleep(sleeptime);
}
Dispose();
}

希望有人能赐教:-D

最佳答案

您问题的核心:

这几乎取决于您的编程风格和程序本身。

一个多线程进程可以获得与多个实例相同的性能。但正如我所说,这取决于您的服务。我建议您阅读这本书的在线版本:Parallel programming with .net .它让我对 PLinq、任务和线程大开眼界。

但最终,它全部运行在您的 CPU 上,进程间通信比线程间通信更复杂。

关于c# - 基于任务的编程与应用程序的多个实例具有相同的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21178515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com