gpt4 book ai didi

c# - "Throttle"一个函数

转载 作者:太空狗 更新时间:2023-10-29 20:33:31 26 4
gpt4 key购买 nike

我正在开发一个 MMORPG 游戏服务器,虽然游戏服务器中 80% 的功能不需要这种方法,但会使用它的 20% 的功能占了 99% 的资源使用量。

我正在尝试完成节流功能。假设您调用了一个大型函数,或者您正在为特定条件搜索大型数据结构。触发一个调用可能会导致大量 CPU 使用。

例如,一个大型函数在被调用时会在 4 秒内稳定使用 30% 的 CPU 来完成,假设我们正在按条件搜索拍卖系统中的数百万个条目。想象一下,我们有 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()) { }
}

这不会阻塞值的初始化,也不会在使用惰性值时阻塞。然而,在大量操作期间,执行操作会使硬件饿死以完成任务,导致 4 秒内 30% 的 CPU 使用率。我的目标是在几乎无限的时间内限制调用,这样他们就可以在不耗尽硬件的情况下完成任务。

编辑:感谢 Scott Chamberlin 用正确的“术语”纠正我。我不想懒惰地调用方法,但我希望“限制”特定方法调用。

最佳答案

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

正如 willaien 所提到的,线程优先级是您在进程中拥有的唯一 CPU 节流机制之一,甚至是间接的。这是因为直接控制 CPU 利用率不是应用程序的责任;管理线程等系统资源是操作系统和处理器的责任。这允许操作系统防止单个应用程序崩溃。

如何在您的编程语言之外限制您的功能?

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

如果您采用这种方式,您可能需要研究 .NET 的异步模式。这还将确保您的原始服务不受使用分布式服务时阻塞的线程的限制。

关于c# - "Throttle"一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148299/

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