Волокна в C#: они быстрее чем итераторы, и люди использовали их?

Поэтому я беседовал с коллегой о волокнах и перешел к статье 2003 года, в которой описывается реализация сопрограмм в C# с использованием Fiber API.

Реализация Yield в этой статье был для.NET 1.1, поэтому он предшествует yield return синтаксис, который появился в.NET 2.0.

На первый взгляд, определенно выглядит, что реализация здесь потенциально быстрее и может достаточно хорошо масштабироваться на нескольких процессорах.

Кто-нибудь использовал это?

3 ответа

Решение

Я не использовал это, но у меня есть интерес к предмету. Вот одна хорошая реализация сопрограмм в C# с планировщиком циклического перебора: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

Кстати, цитируя википедию, "волокна описывают, по сути, ту же концепцию, что и сопрограммы". Насколько я знаю, ближе всего к сопрограмме (или волокну) в C# являются итераторы. На самом деле они очень близки к сопрограммам. Липперт опубликовал несколько уловов об итераторах. Надеюсь, ни один из них не представляет серьезной проблемы для тех целей, которые вам нужны.

Я использовал основанные на урожайности "сопрограммы", и я должен сказать, что они - боль в заднице. Проблема, конечно, в том, что везде, где вы хотите их использовать, вы вынуждены использовать синтаксис yield. Не только это, но если вы не создадите цепочку доходностей (родительский урожай принесет дочерний доход), вы можете когда-либо вкладывать свои сопрограммы только на один уровень глубиной. Это полностью уничтожает одно из ключевых преимуществ сопрограмм (полное сохранение / восстановление стека).

Я внедрил систему сопрограмм на основе волокна в C#, и она работала чудесно, пока я не наткнулся на исключение. К сожалению, среда выполнения.Net хранит кучу внутренних исключений в потоках ОС, что означает, что эмуляция нескольких потоков с использованием волокон ОС (и p/invoke) просто не будет работать, если у вас никогда не будет исключений.

Сопрограммы, на первый взгляд, привлекают мое внимание... несколько дней назад я искал решение для рабочих процессов для параллельных вызовов метода AsyncWCF, и то, что я нашел, было действительно захватывающим:

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

В этой статье показано очень хорошее использование сопрограмм для создания / управления рабочими процессами в приложении Silverlight, которое использует WCF с использованием Async Pattern.

Я не знаю его скорости по отношению к итераторам, но для меня это как расширенная форма подпрограмм, которые могут быть очень полезны в критически важных задачах, где обычная подпрограмма не может предложить вам роскошь выполнять задачу параллельно.

Другие вопросы по тегам