Maison >développement back-end >Golang >Tâches C# asynchrones/attente et goroutine de Golang

Tâches C# asynchrones/attente et goroutine de Golang

PHPz
PHPzavant
2024-02-09 23:40:09817parcourir

C# 任务 async/await 与 Golang 的 goroutine

l'éditeur php Baicao vous présentera aujourd'hui les tâches async/await en langage C# et goroutine en langage Golang. Les deux techniques sont des méthodes de mise en œuvre de programmation simultanée qui fournissent des solutions plus simples et plus efficaces pour gérer des tâches simultanées. En utilisant async/await et goroutine, les développeurs peuvent facilement écrire des programmes hautes performances et à haute concurrence, améliorant ainsi la vitesse de réponse des applications et l'expérience utilisateur. Jetons un coup d'œil aux caractéristiques et à l'utilisation de ces deux technologies !

Contenu de la question

J'apprends C# et Golang depuis un certain temps et j'essaie de comparer la manière dont ils prennent en charge la programmation asynchrone.

Ma compréhension des goroutines est que le runtime go peut planifier l'exécution des goroutines sur différents threads physiques/machines. Si une goroutine est bloquée (par exemple, en attente d'E/S de manière synchrone), le runtime go peut suspendre la goroutine et libérer le thread physique pour exécuter d'autres goroutines.

C# Task 与 goroutine 类似,因为它也是物理线程之上的抽象。然而,在 async Task 内进行阻塞 I/O 被认为是一个坏主意,因为“整个线程将被阻塞,导致死锁”。 C#运行时不能做一些类似于goroutine的事情来挂起被阻塞的async Task并释放物理线程来运行其他async Tasks ?

Je suis aux prises avec ce problème depuis un certain temps et je ne trouve pas de document public qui l'explique mieux. Peut-être que ma compréhension est incorrecte. Quelqu'un peut-il m'aider?

Solution

Les tâches C# sont similaires aux goroutines dans le sens où elles sont également une abstraction au-dessus des threads physiques.

D'un très haut niveau, oui, ils sont probablement similaires.

Cependant, bloquer les E/S dans une tâche asynchrone est considéré comme une mauvaise idée car "le thread entier sera bloqué, provoquant un blocage".

Le blocage n'entraîne pas nécessairement un blocage, mais le blocage bloque le thread appelant jusqu'à ce que la tâche soit terminée. C'est le but.

Le runtime C# ne peut-il pas faire quelque chose de similaire à une goroutine pour suspendre le blocage des tâches asynchrones et libérer le thread physique pour exécuter d'autres tâches asynchrones ?

Les méthodes asynchrones utilisent simplement await 即可获得您想要的行为。阻塞专门用于阻塞线程。从概念上讲,goroutine 有点像让每个方法都为 async 并在各处隐式使用 await .

Dans un cas plus général, le runtime C# effectue des opérations de type goroutine pour gérer tout blocage : en raison de la rétrocompatibilité, le runtime C# ne peut pas facilement effectuer cette opération. Il existe également de nombreux codes existants qui s'appuient sur des "threads spéciaux" (thread UI, thread COM STA, etc.) où une approche thread/coroutine verte serait plus difficile. Go évite essentiellement les problèmes d’incompatibilité descendante en créant un tout nouvel écosystème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer