- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个 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/
上下文:我正在 javascript tutorial 的任务下编写一个简单的 throttle 。 任务:编写一个像这样工作的 throttle : function f(a) { consol
我有一个带有 React 函数 component 的简单点击事件,我尝试使用 RxJS throttleTime 进行 throttle 。每次单击我都会在 500 毫秒 内 throttle ,但
在 Laravel 6 中,密码代理现在具有以下功能来限制密码重置( https://github.com/laravel/framework/blob/6.x/src/Illuminate/Auth
我有一个事件监听器,我正在尝试用 lodash.throttle 包装它: import throttle from "lodash.throttle" const throttledHandleRe
当我尝试使用 go get 命令安装 throttled 时: go get "github.com/throttled/throttled" 我得到错误: 无法加载包:包 github.com/th
更具体地说,我正在寻找 BlackBerry 6.0 API Animator 类,其构造函数描述为“创建一个以指定帧速率限制 update() 调用的 Animator 对象”。 http://ww
在应用洞察中,在 API->Activity & Errors 下有与“Api Throttling”和“API Throttling Warnings”相关的部分。但是我找不到关于这些部分的含义以及
最近,我们在使用IPP数据服务的应用中,不时遇到这些错误。 ErrorRequest 2012-12-07T10:10:59+00:00 3001 messag
最近,我们在使用IPP数据服务的应用中,不时遇到这些错误。 ErrorRequest 2012-12-07T10:10:59+00:00 3001 messag
我有以下代码: IDisposable subscription = myObservable.Throttle(TimeSpan.FromMilliseconds(50), RxApp.MainTh
我有一个定义 onDragEvent 的 Controller : controller = Em.Object.create( { onDragEvent: function() {
我如何使用 ScheduledThreadPoolExecutor、ScheduledFuture 和 ExecutorCompletionService 的组合来限制接受可变参数?收到来自 Call
我在 trait ThrottlesLogins 中添加了以下方法在 Laravel 5.5 中 protected function TotalRegisterAttemptsLeft($reque
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我可能对此完全疯了,但是YouTube视频的下载/缓冲速率似乎在一开始就更快,并且缓冲点距当前播放的标记越远,缓冲的速度就越慢。 我疯了吗,还是对其他所有人一样? 假设是后者,那么关于它们如何做的任何
我在我的几个页面上设置了无限滚动功能。它工作得很好,但是加载更多项目的 Ajax 调用会进行多次数据库调用,并且每次都必须加载大量图像,并且通常需要几秒钟才能加载。根据我的连接情况,我将其计时在 3
加特林世界的新手,但一位经验丰富的 Loadrunner 用户。我创建了一个示例模拟来运行两个场景,每个场景有 10 个用户,并且希望运行 10 分钟。以下是我的 setup 函数中的内容。但每次我运
我想知道是否有办法执行诸如 System.out.println(); 之类的操作或记录已发生的限制。目前我可以查看是否发生限制的唯一方法是将rejectExecution 设置为True。问题在于,
我正在使用一个 API,它只允许您使用像 request-promise 或 axios 这样的 promise 请求库每秒进行 200 次调用(1000 毫秒)怎么可能你使用 rx.js 去抖/限制
我正在以用户在多线程环境中定义的批量大小写入内存分布式数据库。但是我想限制写入ex的行数。 1000 行/秒。这个要求的原因是我的生产者写得太快而消费者遇到叶内存错误。在批处理记录时是否有任何标准做法
我是一名优秀的程序员,十分优秀!