并行处理许多 API 请求与异步/等待 [关闭]
Posted
技术标签:
【中文标题】并行处理许多 API 请求与异步/等待 [关闭]【英文标题】:Handle many API requests in parallel vs async/await [closed] 【发布时间】:2021-09-30 12:08:33 【问题描述】:CPU 密集型问题是需要 CPU 进行计算的问题。 IO 绑定问题是需要等待网络、磁盘或输入的问题。 单个 API 请求是 IO 绑定的。
问题是,当我使用 for 循环发出 100 个 API 请求时,我们是否说这些请求是 IO 绑定的?还是我们说它们受 CPU 限制?还是说它们都受 CPU 和 IO 限制?
通常对于 IO 绑定,我们使用多线程,或者如果我们使用单线程,我们可以使用 async/await。至于 CPU 绑定的进程,我们使用并行编程或多处理或异步等待 Task.Run。
对于我在 for 循环中的 100 个 API 请求的示例,async/await 是否比多线程或 async/await+Task.Run 或 TPL 更好?
【问题讨论】:
这么多混乱...您是在 制作 api 调用还是从 API 的角度来看?如果您对网络 api 进行 100 次调用,那么在该客户端上下文中,它完全是 I/O 绑定的。如果你在另一边,那么这取决于api在做什么。它可能是 I/O、CPU 或混合的。 顺便说一句:“单线程异步等待”没有任何意义。最后,你真的不知道你最终会使用多少个线程。 Async/Await 任务从线程层抽象出来。它可能在单个线程或多个线程上执行。但最后:你不在乎。它的设计让您不必在意(当然有例外)。 “对于我在 for 循环中 100 个 api 请求的示例,异步等待是否比多线程更好?” - 你对“更好”的定义是什么? 您能否向我们展示如何使用并行编程(或多线程)来发出 100 个并发 I/O 绑定 API 请求?我之所以问,是因为困境可能不是“并行与异步/等待”,而是“同步与异步”。 @fildor - 假设我不使用Task.Run,那么这不是保证将使用相同的线程吗? 【参考方案1】:如果您有 100 个 I/O 绑定操作,那么这 100 个操作作为一个整体仍然是 I/O 绑定的。
CPU-bound 是为占用大量 CPU 时间的事情保留的。是的,从技术上讲,增加一个计数器并开始下一个 I/O 操作确实会执行 CPU 操作码,但循环不会被视为“CPU-bound”,因为执行 I/O 所花费的时间远远高于执行时间CPU 工作。
【讨论】:
什么因素会影响我必须使用多线程还是异步等待方法? 对 I/O 密集型工作使用异步,对 CPU 密集型工作使用并行。 1.开发人员是使用像 thread.start() 这样的多线程还是异步等待和任务是前进的方向? 2. cpu bound 的并行性。好的。但我正在阅读 async await + task 有助于 cpu 绑定,而 async await 有助于 io 绑定。 @variable:如果可以的话,你不应该使用new Thread
;使用 TPL 或 PLINQ 进行并行工作。
Stephen- TPL 是指异步等待 Task.Run 还是意味着 Parallel.ForEach?抱歉新手问题。以上是关于并行处理许多 API 请求与异步/等待 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章