在并行中进行多个 Web 请求和响应解析的有效策略

穆图库玛·帕拉尼亚潘

我的服务有一个函数,它会触发 web 请求、解析响应并使用响应进行大量计算以最终给出一个集合。

我现在必须对那些进行多次调用以获得许多可以在以后聚合为一个的集合。我想我可以选择其中任何一个Parrallel.ForEach and Tasks.StartNew

您能否建议哪种方法可以有效地处理具有 webrequest 处理和计算的这种情况。

西奥多·祖利亚斯

Parrallel.ForEach并且Tasks.StartNew适用于受 CPU 限制的工作负载。对于受 I/O 限制的工作负载,您需要异步性,Task.Run(async () => { await ...现在在您的情况下,您同时拥有受 CPU 和 I/O 限制的工作负载,这是最方便的好消息是异步基础架构也可以很好地处理受 CPU 限制的工作负载。例如,这是完全有效的:

private async void Button1_Click(object sender, EventArgs args)
{
    var webData = await GetWebData(url); // I/O bound
    var parsedList = await Task.Run(() => ParseWebData(webData)); // CPU bound
    await SaveListToDB(parsedList); // I/O bound
}

I/O 操作期间不会阻塞任何线程,线程池线程将执行 CPU 密集型解析。从可扩展性和资源保护的角度来看,您没有比这更好的了。但是,如果您愿意占用机器的所有资源以获得可能的最佳性能,而不为其他进程留下任何空闲,那么您的策略应该是让所有处理器/内核一直忙碌,同时执行外部世界可以处理的最大并发 I/O 操作数(Web 服务器、文件系统、数据库,对于可以同时执行的工作量都有限制)。

您应该寻找实施此策略的一个好工具是TPL 数据流库,它是 .NET Core 的内置程序,可作为.NET Framework的包提供。如果您对此一无所知,它有一些学习曲线,但不是很陡峭。经过 2-3 天的学习,您会非常有信心用它编写高质量和健壮的生产代码。它拥有拆分、加入、转换、缓冲和并行化工作负载所需的所有工具,让您感觉自己在控制流程,而无需对所有内容进行微观管理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Bash / Shell中进行并行处理的有效方法?

使用OR和ORDER BY / LIMIT从多个表中进行有效的多个子查询

使用Python有效地请求和处理多个HTML文件

有输入时在R中进行Web爬取

是否应该对Web服务的请求和响应进行相同的编码?

如何有效地在haskell中进行逆序列求和?

使用多个yacc解析器进行并行制作

如何并行执行Web请求?

如何在解析中进行有效的布尔“假或未定义”查询?

如何在Erlang中进行并行调用并等待所有结果?

在具有多个表的Linq查询中进行分组

在模板文件中进行迭代时有多个组

从具有动态WHERE条件的多个CTE中进行选择

从具有多对多关系的多个表中进行选择

在同一控制器上的Web Api中进行多个POST调用的最佳实践

如何传递多个参数以获取方法并在.NET Core Web API中进行路由?

点字符“。” 在MVC Web API 2中进行请求,例如api / people / STAFF.45287

Python,使用dict进行有效的并行操作

对具有不同结构的多个网站进行Web爬网

用python请求和漂亮汤进行Web抓取

GET请求有效,但Web API 2中的POST请求404

Undertow 是否具有与 Tomcat WebAuthentication 等效的用于在 Web 层中进行身份验证的功能?

在bash中进行计算的有效方法

Spark:在RDD对中进行有效的批量查找

使用mgo在MongoDB中进行有效的分页

在Scala中进行有效的最近邻居搜索

在Mongodb中进行聚合的有效方法

如何在Django中进行有效查询?

如何在grpc中进行有效负载压缩?