2013-09-06 25 views
13

Ben net/http/httptest aşağıdaki kodu bulundu ve boş select açıklamada git ne yaptığını merak ediyorum.Boş bir seçim ne yapar?

go s.Config.Serve(s.Listener) 
if *serve != "" { 
    fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) 
    select {} 
} 

cevap

8

Boş select{} deyimi blokları süresiz yani sonsuza dek. Benzer ve pratikte boş bir for{} ifadesine eşdeğerdir.

+0

olacaktır. Bununla birlikte, ben onu anlamsal olarak garip buluyorum, çünkü 'select' bir durum değil, bir döngü önerir. –

+8

AFAIK için boş bir yer, cpu üzerinde yoğun olacaktır (en azından sonsuz döngüler bu kadar boş döngüleri diğer dillerde çalışmaktadır). OP örneğinde iken, ana goroutinin çıkmasını önlemek için {} seçeneğinin kullanılması muhtemeldir. – justinas

+3

CSP-konuşmasında, boş seçim hiçbir zaman ilerlemeyen bir işlem olan 'STOP' gibidir. Bu, kendi kendine kilitlenmeye benziyor ve bunun sık sık kullanılmadığını hayal ediyorum. Ancak, soru bu model için ilginç ve gerçek bir kullanım durumu önermiştir. Boş bir 'for {}' döngü, cpu kaynaklarını tüketmesi nedeniyle farklı bir kendi kendini kurtarır. –

4

boş select deyimi sadece blok akım goroutine. Bunu ediyorum neden gelince

, burada bir nedeni budur. Bu kod parçacığı, boşa gitti bir goroutine sahip olmaması daha iyidir. Daha da kötüsü, artık kod tekrarı var. Yazar, boş bir kaynak üzerinde daha az kod tekrarı için optimize edilmiştir. Ancak, kalıcı olarak blok goroutinin tespit edilmesi önemsizdir ve çoğaltma sürümü üzerinde sıfır maliyete sahip olabilir.

Mac OS X'te
7

, Go, for { } maks CPU% neden olur ve sürecin DEVLET Öte yandan running

select { } olacak, maksimum CPU% neden olmaz ve İşlemin STATE'si benim tahminim olan sleeping