Go dilinin goroutines'i nasıl düzenlediğini merak ediyorum. Sadece kanal istekleri ve I/O sırasında mı değişiyor yoksa periyodik bir coroutine anahtarlama döngüsüne mi sahip?Go, goroutines arasındaki bağlamın ne zaman değiştirileceğine nasıl karar veriyor?
6
A
cevap
8
Git henüz önleyici bir zamanlayıcı yok, ama bir planned for 1.2 olduğunu. Öyleyse, Go sadece CPU-only hesaplamaları sırasında içeriği değiştirmeyecektir, sadece I/O sırasında (bellekten okuma da zaten bir kayıtta değilse G/Ç olarak kabul edilir). Bununla ilgili bazı tartışmaları Issue 543 - preemptive scheduling'da okuyabilirsiniz.
Eğer doğru anlıyorsam, bu bağlantıların 'önleyici zamanlama' bölümünde anlatılanları çağırmak çok uzak. Bu gerçekten önleyici değildir, sadece verimler programcıya görünmeyecek şekilde daha fazla yere konur. Elbette, bu program daha “eşzamanlı” hale getirir, ama yine de kooperatiftir. Özel VM (Erlang gibi) kullanmadan veya doğrudan işletim sistemi desteği (OS iş parçacığı) kullanmadan önleyici çoklu görev yürütmenin imkansız olduğunu düşünüyorum. –
Cevabınızı güncelleyebilir misiniz? Go'nun bir süredir işlev çağrılarında ön-kayıt yapabildiğini duydum ama emin değilim. –