Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tugas C# tidak segerak/menunggu dan goroutine Golang

Tugas C# tidak segerak/menunggu dan goroutine Golang

PHPz
PHPzke hadapan
2024-02-09 23:40:09747semak imbas

C# 任务 async/await 与 Golang 的 goroutine

editor php Baicao akan memperkenalkan kepada anda hari ini tugas async/menunggu dalam bahasa C# dan goroutine dalam bahasa Golang. Kedua-dua teknik adalah kaedah untuk melaksanakan pengaturcaraan serentak yang menyediakan penyelesaian yang lebih mudah dan lebih cekap apabila menangani tugas serentak. Dengan menggunakan async/wait dan goroutine, pembangun boleh dengan mudah menulis program berprestasi tinggi, konkurensi tinggi, dengan itu meningkatkan kelajuan tindak balas aplikasi dan pengalaman pengguna. Mari kita lihat ciri-ciri dan penggunaan kedua-dua teknologi ini!

Kandungan soalan

Saya telah mempelajari C# dan Golang untuk seketika dan cuba membandingkan cara mereka menyokong pengaturcaraan tak segerak.

Pemahaman saya tentang goroutin ialah masa jalan pergi boleh menjadualkan gorouti untuk dijalankan pada rangkaian fizikal/mesin yang berbeza. Jika goroutine disekat (contohnya, menunggu I/O secara serentak), masa jalan pergi boleh menggantung goroutine dan melepaskan benang fizikal untuk menjalankan goroutin lain.

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

Saya telah lama bergelut dengan masalah ini dan tidak dapat mencari bahan awam yang menerangkannya dengan lebih baik. Mungkin pemahaman saya tidak betul. Bolehkah sesiapa membantu saya?

Penyelesaian

C# tugasan adalah serupa dengan goroutine kerana ia juga merupakan abstraksi di atas benang fizikal.

Dari tahap yang sangat tinggi, ya, mereka mungkin serupa.

Walau bagaimanapun, melakukan penyekatan I/O dalam tugas tak segerak dianggap sebagai idea yang tidak baik kerana "seluruh rangkaian akan disekat, menyebabkan kebuntuan".

Menyekat tidak semestinya membawa kepada kebuntuan, tetapi menyekat menyekat urutan panggilan sehingga tugasan selesai. Itulah maksudnya.

Tidak bolehkah masa jalan C# melakukan sesuatu yang serupa dengan goroutine untuk menangguhkan tugasan tak segerak dan melepaskan benang fizikal untuk menjalankan tugas tak segerak yang lain?

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

Dalam kes yang lebih umum, masa jalan C# melakukan operasi seperti goroutine untuk mengendalikan sebarang penyekatan: disebabkan keserasian ke belakang, masa jalan C# tidak dapat melaksanakan operasi ini dengan mudah. Terdapat juga banyak kod warisan yang bergantung pada "benang khas" (benang UI, utas COM STA, dll.) di mana pendekatan benang hijau/coroutine akan menjadi lebih sukar. Go pada dasarnya mengelakkan isu ketidakserasian mundur dengan mencipta ekosistem baharu sepenuhnya.

Atas ialah kandungan terperinci Tugas C# tidak segerak/menunggu dan goroutine Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam