Ben sadece sıradan bir Go kullanıcısıyım, bu yüzden aşağıdakileri bir tane tuzla atın.
Wikipedia yeşil konuları "doğal olarak temel işletim sistemi yerine sanal bir makine (VM) tarafından planlanan konular" olarak tanımlar . Yeşil iş parçacıkları, yerel işletim sistemi özelliklerine güvenmeden çok iş parçacıklı ortamlara öykünür ve yerel iş parçacığı desteği olmayan ortamlarda çalışmalarını sağlamak için çekirdek alanı yerine kullanıcı alanında yönetilir.
Go (ya da tam olarak iki uygulama), yalnızca yerel kod üreten bir dildir - VM kullanmaz. Ayrıca, geçerli çalışma zamanı uygulamalarındaki zamanlayıcı, işletim sistemi düzeyinde iş parçacıklarına dayanır (GOMAXPROCS = 1 olduğunda bile). Bu yüzden Go modeli için yeşil ipliklerden bahsetmek biraz küfürbaz.
Go insanlar özellikle diğer eşzamanlılık mekanizmalarıyla (koroinler veya iplikler veya hafif işlemler gibi) kafa karışıklıklarını önlemek için goroutin terimini kullandılar.
Elbette, Go bir M: N diş açma modelini destekliyor, ancak Erlang işlem modeline, Java yeşil diş modelinden çok daha yakın görünüyor.
Go modelinin yeşil dişler üzerindeki bir kaç avantajı (JVM'nin başındaki gibi):
Geliştirici için saydam bir şekilde birden fazla çekirdek veya CPU etkin bir şekilde kullanılabilir. Go ile, geliştirici eşzamanlılık ile ilgilenmelidir. Go çalışma zamanı paralelliği önemser. Java yeşil iş parçacığı uygulamaları, birden çok çekirdek veya CPU'yu ölçeklemedi.
Sistem ve C çağrıları zamanlayıcı için engelleyici değildir (tüm sistem çağrıları, yalnızca olay döngülerinde çoğullamalı I / O'ları destekleyenler değil). Yeşil iplik uygulamaları bir engelleme sistemi çağrısı yapıldığında tüm süreci engelleyebilir.
Kopyalama veya bölümlenmiş yığınlar. Go'da, goroutine için maksimum yığın büyüklüğü sağlamaya gerek yoktur. Yığın, gerektiği kadar artan şekilde büyür. Bunun bir sonucu olarak, bir gorotin çok fazla hafıza gerektirmez (4KB-8KB), bu yüzden çok sayıda mutlu bir şekilde ortaya çıkarılabilir. Goroutin kullanımı bu nedenle yaygın olabilir.
Şimdi, eleştirilere değinmek için:
Go ile bir kullanıcı alanı zamanlayıcısı yazmak zorunda değilsiniz: çalışma zamanı zaten sağlanmış durumda. Bu karmaşık bir yazılım parçasıdır, ancak Go kullanıcılarının değil Go geliştiricilerin problemidir. Go kullanıcıları için kullanımı şeffaftır. Go geliştiricileri arasında Dmitri Vyukov , kilitsiz / beklemesiz programlama konusunda uzmandır ve özellikle zamanlayıcının nihai performans sorunlarını ele almakla ilgilenmektedir. Geçerli zamanlayıcı uygulaması mükemmel değil, ancak geliştirecek.
Senkronizasyon performans problemi ve karmaşıklık getiriyor: bu Go ile de kısmen doğrudur. Ancak Go modelinin, senkronizasyon karmaşıklığını sınırlamak için kanalların kullanımını ve programın eşzamanlı goroinlerdeki temiz bir şekilde ayrıştırılmasını sağlamaya çalıştığını unutmayın (örn. İletişim kurmak için belleği paylaşmak yerine, iletişim kurarak verileri paylaşın). Bu arada, referans Go uygulaması, bir profiler ve yarış dedektörü gibi performans ve eşzamanlılık sorunlarını ele almak için çeşitli araçlar sunar .
Sayfa arızası ve "numaralandırma faktörü" ile ilgili olarak Go'nun, birden fazla sistem parçacığı üzerinde goroutine zamanlama yapabileceğini unutmayın. Bir iş parçacığı herhangi bir sebepten dolayı bloke edildiğinde (sayfa hatası, sistem çağrılarının engellenmesi), diğer iş parçacıklarının diğer iş programlarını programlamaya ve çalıştırmaya devam etmesini engellemez. Şimdi, bir sayfa hatasının OS iş parçacığını engelleyeceği, bu iş parçacığında programlanmış olması gereken tüm goroutinlerle doğru olacağı doğrudur. Ancak pratikte, Go yığın hafızasının değiştirilmemesi gerekiyordu. Bu Java ile aynı olurdu: çöp toplanan diller zaten çok iyi bir şekilde sanal belleği barındırmıyor. Programınız sayfa arızasını zarif bir şekilde ele almalıysa, büyük olasılıkla bazı açık bellek yönetmesi gerektiğinden dolayı. Bu durumda,
Yani IMO, goroutinler yeşil iplikler değildir ve Go dili ve mevcut uygulama çoğunlukla bu eleştirileri ele almaktadır.