纤维用例

Fibers use cases

我阅读了很多有关 Fibersgreen threads 或我们可以为用户空间线程起的任何其他名称的文章。我开始阅读文档和教程(这些是 C++ 链接,但我不需要特定语言):

然而,我似乎无法掌握有关纤维的要领。我知道 fibers 是一种协同多任务的方式,但据我所知,关于实际情况下线程和 fibers 之间相互作用的文档很少。

What are some practical use cases of fibers?

例如,每个文档实际上都使用异步 I/O 作为示例,但是如果我没有 I/O 绑定问题怎么办?例如,如果我的问题是 计算一个大文件中的单词数 怎么办?在这里,我只是将文件拆分到多个线程中,纤维能以某种方式提供帮助吗?我认为 CPU 边界计算,如数值问题(例如,matrix/vector 操作)不适合纤维,但我可能完全错了。

what if my problem is counting words in a huge file? ..., can fibers help somehow?

没有

every doc actually uses async I/O as an example

A​​syncI/O是多CPU系统还没有走出实验室的时候,线程本来要解决的问题。线程是构建程序的另一种方式,该程序必须等待来自多个不同的非同步源的输入,并且必须及时响应这些输入。

根据它们的实施方式,当时的线程规模可能在 "mostly the same as" 到 "completely identical with" 之间,我们今天称之为 "green threads" 或 "fibers" .

当多 CPU 系统投放市场时,线程被视为利用并行处理能力的一种自然而明显的方式。

与 OS 线程相比,纤程在创建和上下文切换方面的开销更低。所以理论上,如果你有一个解决方案,其中有很多锁阻塞,你可能会看到纤程的性能提升,因为纤程 运行 所在的 OS 线程将使用更多分配给它们的 运行时间。这是因为当纤程 mutex/lock 上的纤程阻塞时,底层 OS 线程将调用纤程调度程序,该调度程序将 运行 不同的纤程,而无需执行 OS-线程上下文切换。这是 M:N 线程模型背后的基本思想。

另一种情况是,如果您需要频繁或大量地创建和销毁线程。由于纤程创建速度更快,而且通常比 OS 线程更轻巧,因此您可以使用更多数量的纤程,并获得更细粒度的并行性(理论上。)

一个实际应用是使用角色模型进行基于大型代理的模拟。使用光纤,每个 agent/actor 可以在其自己的光纤上 运行。