Les canaux, la pièce manquante
Les pipelines sont la pièce manquante par rapport aux canaux dans golang. Les canaux sont en fait ce qui fait fonctionner golang. Les channels sont l'outil de base de la concurrence. Si vous utilisez quelque chose comme une coroutine en C# mais en utilisant les primitives de synchronisation des threads (sémaphore, moniteur, interlocked, etc.) alors ce n'est pas la même chose.
Presque la même chose - Pipelines, mais intégrés dans le système
8 ans plus tard, et .Net Standard (.Net Framework / .Net Core) a le support pour les Pipelines [ [https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/\]](https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/]) . Les pipelines sont préférés pour le traitement en réseau. Aspcore se classe maintenant parmi les 11 meilleurs taux de demande de débit en texte clair [ [https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext\]](https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext]) .
Microsoft conseille les meilleures pratiques pour l'interfaçage avec le trafic réseau : les octets réseau attendus (Completion Port IO) doivent placer les données dans un pipeline, et un autre thread doit lire les données du pipeline de manière asynchrone. Plusieurs pipelines peuvent être utilisés en série pour divers processus sur le flux d'octets. Le pipeline possède un curseur de lecture et un curseur d'écriture, et la taille de la mémoire tampon virtuelle provoquera une contre-pression sur l'écrivain afin de réduire l'utilisation inutile de la mémoire pour la mise en mémoire tampon, ce qui ralentit généralement le trafic réseau.
Il y a quelques différences essentielles entre les Pipelines et les Canaux Go. Les pipelines ne sont pas les mêmes qu'un canal Go. Les pipelines servent à passer des octets mutables plutôt que les canaux golang qui servent à signaler des références mémoire (y compris les pointeurs). Enfin, il n'y a pas d'équivalent select
avec les pipelines.
(Les pipelines utilisent des travées [ [https://adamsitnik.com/Span/\]](https://adamsitnik.com/Span/]) qui existent depuis un certain temps, mais qui sont maintenant optimisées en profondeur dans .Net Core. Les portées améliorent considérablement les performances. La prise en charge de .Net Core améliore encore les performances, mais seulement de manière incrémentielle, de sorte que l'utilisation de .Net Framework est parfaitement acceptable. )
Les pipelines sont donc un standard intégré qui devrait aider à remplacer les canaux golang dans .Net, mais ils ne sont pas identiques, et il y aura beaucoup de cas où les pipelines ne sont pas la réponse.
Implémentations directes du canal Golang
Vous devez faire attention (comme avec golang) à ce que les messages transmis via un canal .Net indiquent un changement de propriété d'un objet. C'est quelque chose que seul un programmeur peut suivre et vérifier, et si vous vous trompez, vous aurez deux ou plusieurs threads accédant aux données sans synchronisation.
0 votes
Lien : blogs.msdn.com/larryosterman/archive/2005/01/05/347314.aspx
0 votes
Vous trouverez peut-être ceci utile/intéressant : github.com/bvanderveen/coroutine