任务并行库 - 自定义任务调度程序

2024-02-29

我需要向在线 api 发出 Web 服务请求,我认为并行扩展非常适合我的需求。

所涉及的网络服务被设计为重复调用,但有一种机制,如果每秒的调用次数超过一定数量,就会向您收费。我显然想最大程度地减少费用,因此想知道是否有人见过可以满足以下要求的 TaskScheduler:

  1. 限制每个时间跨度计划的任务数量。我想如果请求数量超过这个限制,那么它需要丢弃任务或者可能阻塞? (停止积压的任务)
  2. 检测相同的请求是否已在要执行的调度程序中但尚未执行,如果是,则不将第二个任务排队,而是返回第一个任务。

人们是否认为这些是任务调度程序应该处理的职责,或者我是不是找错了对象?如果您有其他选择,我愿意接受建议。


我同意其他人的观点,即 TPL Dataflow 听起来是一个很好的解决方案。

要限制处理,您可以创建一个TransformBlock这实际上不会以任何方式转换数据,只是如果它在前一个数据之后太早到达,它就会延迟它:

static IPropagatorBlock<T, T> CreateDelayBlock<T>(TimeSpan delay)
{
    DateTime lastItem = DateTime.MinValue;
    return new TransformBlock<T, T>(
        async x =>
                {
                    var waitTime = lastItem + delay - DateTime.UtcNow;
                    if (waitTime > TimeSpan.Zero)
                        await Task.Delay(waitTime);

                    lastItem = DateTime.UtcNow;

                    return x;
                },
        new ExecutionDataflowBlockOptions { BoundedCapacity = 1 });
}

然后创建一个生成数据的方法(例如从 0 开始的整数):

static async Task Producer(ITargetBlock<int> target)
{
    int i = 0;
    while (await target.SendAsync(i))
        i++;
}

它是异步写入的,因此如果目标块现在无法处理这些项目,它将等待。

然后编写消费者方法:

static void Consumer(int i)
{
    Console.WriteLine(i);
}

最后,将它们链接在一起并启动它:

var delayBlock = CreateDelayBlock<int>(TimeSpan.FromMilliseconds(500));

var consumerBlock = new ActionBlock<int>(
    (Action<int>)Consumer,
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded });

delayBlock.LinkTo(consumerBlock, new DataflowLinkOptions { PropagateCompletion = true });

Task.WaitAll(Producer(delayBlock), consumerBlock.Completion);

Here, delayBlock每 500 毫秒最多接受一个项目,并且Consumer()方法可以并行运行多次。要完成处理,请致电delayBlock.Complete().

如果你想为 #2 添加一些缓存,你可以创建另一个TransformBlock在那里完成工作并将其链接到其他块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

任务并行库 - 自定义任务调度程序 的相关文章

  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 井字游戏代码有助于改进

    这是我必须检查玩家在井字棋游戏中获胜的代码 这是一个很长的 if 语句 可以改进 该板由 9 个图片框组成 我是一名 C 初学者 pBox Image Player players Player playerTurn getImage ch
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • 运行 C# exe 文件

    复制 为什么我的 NET 应用程序在从网络驱动器运行时会崩溃 https stackoverflow com questions 148879 why does my net application crash when run from
  • 如何通过C#在SQLite数据库中写入变量DateTime值?

    我很新C and SQLite数据库并有一些变量存储在 SQLite 数据库中TimeStamp 这是我的代码 DateTime now DateTime Now m dbConnection new SQLiteConnection Da
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 具有多重继承的不明确基数

    我正在尝试在一个大库中编写一些类的子类 我收到 基础不明确 错误 这是该问题的一个可编译示例 include
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • Xamarin.Forms - XamlCompilation MissingMethodException

    我想提高 Xamarin Forms UWP 应用程序的性能 因为它在发布模式下非常慢 选中 NET Native 因此 我在 PCL 项目中的程序集级别应用了 XAMLC assembly XamlCompilation XamlComp
  • 如何避免“框架分离”错误异步验证或使用 Puppeteer 进行重定向?

    以前的一个answer https stackoverflow com questions 51066987 puppeteer how can i wait for ajax request and process the result为
  • FireStore - 如何绕过数组“不包含”查询

    经过一些研究 很明显我无法使用 FireStore 来查询给定数组不包含的项目 有人有针对这个用例的解决方法吗 用户注册后 应用程序会获取一堆卡片 每张卡片在 FireStore 中都有相应的 卡片 文档 用户与卡片交互后 卡片文档将用户的
  • (PHP) 如何解析Google搜索结果中的URL?

    如何获取google搜索结果的url 我使用 Zend Gdata Gbase 来获取搜索谷歌结果 而不是 DomDocument htmlsimpleparser 因为在我看来 Zend Gdata Gbase 专门用于解析谷歌结果 如果
  • GTK+ 中的 CSS 样式

    好的 我最近开始使用 GTK 用 C 语言进行编程 我的代码中有一个 GdkToggleButton 我想用 css 添加样式 我在这里阅读了几乎所有 GTK3 文档https developer gnome org gtk3 stable
  • 如何从结果中排除零长度正则表达式匹配? [复制]

    这个问题在这里已经有答案了 我进行了快速谷歌搜索 但找不到任何结果 和 包括零长度匹配 我怎样才能将它们从我的结果中排除 例如运行一个 ada 在 1 和 3 处返回零长度匹配 如何排除它们 这是一个非常普遍的问题 我宁愿根据具体情况来解决
  • 用于处理接收中的异步操作的 Akka 模式

    我有一个 Actor 它接收指标数据点并定期聚合并将它们保存到磁盘 后一个操作执行 I O 因此我不想使用阻塞操作 但是 如果我将其切换为异步 如何防止在聚合完成之前接收其他数据点而不阻塞某处 我见过的一种模式是使用Stash 像这样 cl
  • HTML5 Canvas 访问控制允许来源错误

    当我尝试从 canvas 元素获取数据时 出现以下 javascript 错误 错误 不支持 canvas toDataURL 例外 操作不安全 代码 18 ns结果 0x80530012 安全错误 画布是从不同域提供的图像绘制的 但我使用
  • 执行 powershell 时 Kudu REST API 命令端点错误

    当尝试根据 api command 执行 POST 时这个描述 https github com projectkudu kudu wiki REST API command出现以下错误 PS C gt Result Error remov
  • HTML 到 PDF 的 Wicked PDF 和字母间距问题

    使用 0 79 和 0 7 2 生成的 PDF 看起来与我原来的 HTML 略有不同 添加 show as html 标志会按预期显示它 但是内联样式在 PDF 中的处理方式与在 HTML 预览中的处理方式不同 具体来说 我遇到的问题是字母
  • 将大数据从 WCF 服务发送到客户端的最佳方式是什么?

    我有一项返回大量数据的特定服务 WCF 中处理此问题的最佳实践和选项是什么 这些大数据在完成所有过滤后返回 因此无法再进行过滤 数据可以达到GB 我确实知道系统可以处理的数据量是有限的 但在上述场景中 您会推荐哪些选项 替代方案 使用流媒体
  • Vue 路由:未捕获类型错误:window.Vue.use 不是函数

    在我的 Laravel 项目中 我正在使用 Vue 库 并且尝试在模块中使用 vue router 但是当我像往常一样尝试导入 vue router 时 请参阅下面的代码 我的控制台出现错误 未捕获的类型错误 window Vue use
  • 无法在 Kotlin 中打印 Map 的键值

    我对 Kotlin 还很陌生 我想打印字符串中字符的计数 为此 我使用 Kotlin 的groupingBy 功能及应用eachCount to it My code val str 0100101101010 val countMap M
  • 将 byte[] 转换为 Windows.UI.Xaml.Media.Imaging.BitmapImage

    使用通用 Windows 应用程序并尝试绑定 xaml 中字节数组的图像 我有点失落 在 xaml 中我有类似的内容
  • 如何处理 WPF 中数据绑定菜单中的单击事件

    我有一个 MenuItem 其 ItemsSource 数据绑定到一个简单的字符串列表 它显示正确 但我正在努力了解如何为它们处理单击事件 这是一个演示它的简单应用程序
  • Mongodb聚合三个集合

    这两天学习MongoDB 我试图聚合三个集合但无法实现 以下是数据库中维护的四个集合 大学 id 5834ecf7432d92675bde9d82 name NIFT college id 5834ecf7432d92675bde9d83
  • 在 Android 中实现 websocket 客户端的简单方法是什么?下面的例子正确吗?

    我试图使用一个在 Android 中实现 WebSocket 客户端的类 但我收到以下错误 12 07 11 22 46 286 31579 31579 com domain wsocketchat W System ClassLoader
  • CFNetwork 内部错误:CFNetworkInternal.h:478

    我的 iOS 设备日志 在模拟器和真实设备上 充满了几十行以下错误垃圾邮件 CFNetwork 内部错误 0xc01a BuildRoot Library Caches com apple xbs Sources CFNetwork Sim
  • 向 Ember.TextField 添加名称属性?

    这是漫长的一天 这可能非常简单 但是如何向 Ember TextField 添加名称属性 我想做这样的事情 view Ember TextField valueBinding your name placeholder Your name
  • 任务并行库 - 自定义任务调度程序

    我需要向在线 api 发出 Web 服务请求 我认为并行扩展非常适合我的需求 所涉及的网络服务被设计为重复调用 但有一种机制 如果每秒的调用次数超过一定数量 就会向您收费 我显然想最大程度地减少费用 因此想知道是否有人见过可以满足以下要求的