Каналы недостающей части
Трубопроводы - недостающая часть относительно каналов в Голанге.Каналы на самом деле делают галан тик.Каналы являются основным инструментом параллелизма.Если вы используете что-то вроде сопрограммы в C #, но используете примитивы синхронизации потоков (семафор, монитор, блокировка и т. Д.), То это не то же самое.
Почти то же самое - конвейеры, но запеченныечерез
8 лет, и .Net Standard (.Net Framework / .Net Core) поддерживает конвейеры [https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/]. Конвейеры предпочтительнее для сетевой обработки.В настоящее время Aspcore оценивает один из 11 самых популярных запросов к пропускной способности в незашифрованном виде [https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext].
. Microsoft рекомендует лучшие методы взаимодействия с сетевым трафиком: ожидаемые сетевые байты (IO порта завершения) должны помещать данные в конвейер,и другой поток должен читать данные из конвейера асинхронно.Многие конвейеры могут быть использованы последовательно для различных процессов в потоке байтов.В конвейере есть считыватель и курсор записи, а размер виртуального буфера приведет к тому, что обратное давление в модуле записи уменьшит ненужное использование памяти для буферизации, как правило, замедлит сетевой трафик.
Существуют некоторые критические различия между конвейерами иПерейти каналы.Трубопроводы - это не то же самое, что канал Голанга.Конвейеры предназначены для передачи изменяемых байтов, а не каналов Голанга, которые предназначены для передачи сигналов с помощью ссылок на память (включая указатели).И, наконец, не существует эквивалента select
с конвейерами.
(конвейеры используют пролеты [https://adamsitnik.com/Span/],, которые существовали некоторое время назад, но теперь глубоко оптимизированы в .Net Core.производительность значительно. Поддержка ядра .Net еще больше повышает производительность, но только постепенно, поэтому использование .Net Framework прекрасно.)
Таким образом, конвейеры - это встроенный стандарт, который должен помочь заменить каналы golang в .Net, но онине совпадают, и будет много случаев, когда конвейеры не являются ответом.
Прямые реализации канала Голанга
Вы должны быть осторожны (как в случае с golang), когда сообщения, передаваемые через канал .Net, указывают на смену владельца объекта.Это то, что только программист может отследить и проверить, и если вы ошибетесь, вы получите два или более потоков, обращающихся к данным без синхронизации.