纤程使用案例

10

我正在阅读关于Fibers,或者绿色线程,或者其他我们可以给用户级线程的名称的东西。我开始阅读文档和教程(这些是 C++ 的链接,但我不需要一种特定的语言):

然而,似乎我无法掌握关于 fibers 的本质。我知道 fibers 是一种协作式多任务处理的方法,但实际情况下线程和 fibers 之间的相互作用的文档是稀少的。

有哪些实际应用场景使用 fibers?

例如,每个文档都将异步 I/O 作为示例,但如果我没有I/O限制的问题呢?例如,如果我的问题是在巨大文件中数单词,我会将文件在线程之间分割,那么 fibers 可以帮助解决问题吗?我想对于类似数值计算(例如矩阵/向量运算)这样的 CPU 密集型计算来说,使用 fibers 并不适合,但是我也可能完全错了。


2
如果你有大量非常小的计算任务,那么纤程(fibers)可能是一个不错的选择,因为你不需要在每个计算任务的开始和结束时付出管理本地线程的代价。 - Theodoros Chatzigiannakis
2
在这里,我只是会将文件分割成多个线程,这会使得机械硬盘的IO访问速度变慢,因为现在磁头需要在磁盘上跳来跳去而不是顺序读取。即使在SSD上,这仍然受到IO限制,因为处理速度比磁盘访问速度快得多。 - UKMonkey
是的,但是在计算大型数据时,我发现最大的障碍是重新分配内存,这通常比I/O更重要。这只是一个例子,我只想专注于纤程。 - senseiwa
从您提供的第一个链接中可以看出:“同一内核线程上的两个纤程不会在不同的处理器核心上同时运行。” 这似乎排除了将文件分割成纤程的任何好处。 根据定义,您将无法获得多个核心的任何好处。 - ttemple
@ttemple,关于“不需要在纤程之间使用互斥量...”这句话是对的,但不完全正确,“......因为一次只有一个纤程会运行。”事实并非如此。之所以不需要互斥量是因为Boost Fibers 实现了_协作式多任务_: 调度程序只能在运行的纤程通过调用等待某些东西的库调用 让出 控制时才能切换到另一个纤程。使用_抢占式多任务_(即线程)的程序即使在只有一个CPU 的主机上也_需要_互斥锁,因为调度程序可以随时强制进行上下文切换(例如当一个线程完成更新数据的一半时)。 - Solomon Slow
显示剩余3条评论
2个回答

2
如果我的问题是在一个巨大的文件中计算单词,那怎么办?...,纤程能帮忙吗?
不行。
实际上,每个文档都使用异步I/O作为示例。
异步I/O是线程最初被设计用来解决的问题,那时多CPU系统还没有走出实验室。线程是一种替代的程序结构方式,可以等待来自多个非同步源的输入,并且必须及时响应这些输入。
根据它们的实现方式,那些日子里的线程可以在我们今天所称的“绿色线程”或“纤程”上从“大多数相同”到“完全相同”的任何一个范围内。
当多CPU系统进入市场时,线程被视为利用并行处理能力的一种自然和显而易见的方法。

2
纤程(Fibers)旨在创建和上下文切换时的开销低于操作系统线程。因此,理论上,如果您有一个需要频繁加锁阻塞的解决方案,您可能会从纤程中看到性能提升,因为运行纤程的操作系统线程将使用更多的运行时间。这是因为当纤程在纤程互斥锁/锁上阻塞时,底层操作系统线程将调用纤程调度程序,该程序将运行不同的纤程,而无需进行操作系统线程上下文切换。这是M:N线程模型背后的基本思想。
另一种情况是,如果您需要频繁地创建和销毁线程,或者需要大量线程,那么由于纤程的创建速度更快且通常比操作系统线程更轻量级,您可以使用更多数量的纤程,并且可以实现更细粒度的并行(理论上)。
一个实际应用是使用Actor模型进行大型代理基础仿真。使用纤程,每个代理/actor都可以在自己的纤程上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接