【问题标题】:Fibers in C#: are they faster than iterators, and have people used them?C# 中的 Fiber:它们是否比迭代器更快,人们使用过它们吗?
【发布时间】:2010-12-25 06:52:00
【问题描述】:

所以我和一位同事聊了聊fibers 并找到了this paper from 2003,它描述了使用Fiber API 在C# 中实现协程。

本文中Yield 的实现是针对.NET 1.1 的,因此它早于出现在.NET 2.0 中的yield return 语法。

乍一看,这里的实现可能更快,并且可以很好地跨多个 CPU 扩展。

有人用过吗?

【问题讨论】:

  • 我没用过,但我对这个主题很感兴趣。这是一个在 c# 中使用循环调度程序很好地实现协程:bluebytesoftware.com/blog/…
  • 顺便说一句,你希望这个问题得到什么样的答案?
  • 我没用过,但是文章很有意思。问题是,现在这似乎在很大程度上已经在 Windows 中实现了。
  • “可能比什么更快”?
  • @jpbochi:是的,确实比 C# 迭代器快。我期待您给出的那种答案:协程对我来说是新的,纤维也是如此,我很想知道它们是否与高性能系统中的使用相关。

标签: c# yield coroutine fiber


【解决方案1】:

协程,乍一看就引起了我的注意.. 几天前,我正在寻找并行 AsyncWCF 方法调用的工作流解决方案,我发现真的很吸引人:

http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html

本文展示了在使用异步模式使用 WCF 的 Silverlight 应用程序中如何很好地使用协程来创建/管理工作流。

我不知道它对迭代器的速度,但对我来说,它就像一种高级形式的子例程,在普通子例程无法为您提供并行执行任务的任务关键任务中非常有用。

【讨论】:

    【解决方案2】:

    我使用过基于 yield 的“协程”,我不得不说它们很麻烦。当然,问题是,在任何你想使用它们的地方,你都不得不使用 yield 语法。不仅如此,除非你链接产量(父母产量孩子的产量),你只能将你的协程嵌套一层。这完全破坏了协程的主要优势之一(全栈保存/恢复)。

    我在 C# 中实现了一个基于 Fiber 的协程系统,它运行得非常好,直到我遇到异常。不幸的是,.Net 运行时在 OS 线程中存储了一堆内部异常内容,这意味着使用 OS 纤程(和 p/invoke)模拟多个线程是行不通的,除非你永远不会有异常。

    【讨论】:

    • 能否解决非托管代码中缺乏异常处理的问题,方法是在 yield 之前围绕每段托管代码添加 try/catch?
    • 这个答案很重要。这意味着您永远不能在生产中使用基于 Fiber 的协程。
    • 实际上这只是意味着您必须嵌套执行,在执行时支持已处理和未处理的异常,仅在未处理时才完全传播异常。基于异常的编程概念也应该通过 Fiber 概念或合适的衍生产品来支持。
    【解决方案3】:

    我没用过,但我对这个主题很感兴趣。这是一个在 C# 中使用循环调度程序很好地实现协程:http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

    顺便说一句,引用wikipedia,“纤维描述的概念基本上与协程相同”。据我所知,与 C# 中的协程(或纤程)最接近的是迭代器。实际上,它们非常接近协程。 Lippert 发布了几个关于迭代器的问题。希望它们都不代表您需要的严重问题。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多