"节流"功能

Sco*_*tty 7 .net c# c#-5.0

我正在开发一个MMORPG游戏服务器,而游戏服务器中80%的功能不需要这种方法,使用它的20%的功能占资源使用的99%.

我正在尝试完成一个限制功能.假设您调用了一个庞大的函数,或者您正在搜索特定条件的海量数据结构.被激活的一个调用可能导致大量CPU使用.

例如,一个庞大的功能,当被调用时,使用稳定的30%的CPU在4秒内完成,比如我们按照标准在拍卖系统中搜索数百万个条目.想象一下,我们有4个人同时这样做.我想制作相同的方法,只占用1%或更少的CPU,可能需要超过15-20秒才能返回相同的结果而不会使硬件匮乏.

截至目前我正在使用这个课程.

public class AsyncLazy<T> : Lazy<Task<T>> 
{ 
    public AsyncLazy(Func<T> valueFactory) : 
        base(() => Task.Factory.StartNew(valueFactory)) { }
    public AsyncLazy(Func<Task<T>> taskFactory) : 
        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
}
Run Code Online (Sandbox Code Playgroud)

这不会阻止值的初始化,并且在使用惰性值时不会阻塞.但是,在大规模操作期间,执行操作会使硬件无法完成任务,从而导致4秒内CPU使用率达到30%.我的目标是在几乎无限的时间内限制呼叫,这样他们就可以在不使硬件匮乏的情况下完成任务.

编辑:感谢Scott Chamberlin用正确的"行话"来纠正我.我不打算懒洋洋地调用一个方法,但我正在寻找"Throttle"特定的方法调用.

DB *_*ech 3

如何使用您的编程语言来限制函数?

正如 willaien 提到的,线程优先级是进程内唯一的 CPU 限制机制之一,而且即使是间接的。这是因为直接控制 CPU 利用率不是应用程序的责任;操作系统和处理器负责管理系统资源(例如线程)。这使得操作系统可以防止单个应用程序崩溃。

如何在编程语言之外限制您的函数?

您可以将密集的计算分解为完全独立的服务。然后将此服务放置在另一台计算机上,您可以从系统或操作系统级别直接控制其资源(例如通过硬件或使用虚拟机添加更多内存或 CPU 能力)。对于 VM,您可以通过设置 VM CPU 来“限制”该功能。您可以使用负载均衡器等中间件或使用队列来限制进程内请求的数量,“限制”纯硬件解决方案或虚拟机。这将满足您每次计算所需时间的要求。其他服务可以只是一个分布式缓存,(正如 Scott Chamberlain 提到的)数据库存储过程,或者查询数据库位于不同机器上的位置。

如果您选择此路线,您可能需要研究 .NET 的异步模式。这还可以确保您的原始服务不会受到使用分布式服务时阻塞的线程的线程绑定。