2012-11-05 7 views
8

Tôi mới sử dụng Google Go (Golang). Câu hỏi của tôi liên quan đến bài viết này What exactly does runtime.Gosched do?. Cấu trúc mã được sao chép dưới đây. Câu hỏi của tôi, là khi tôi thay đổi số lượng bộ xử lý trong GOMAXPROCS, làm cách nào để xác minh số lượng bộ xử lý đang chạy. Khi tôi làm 'top', nó cho thấy quá trình a.out tiêu thụ 100% hoặc ít tài nguyên hơn ngay cả khi GOMAXPROCS lớn hơn 1. Tôi sẽ biết ơn sự giúp đỡ của bạn.Golang: cách xác minh số bộ vi xử lý mà chương trình Go đang chạy

package main 

import (
    "fmt" 
    "runtime" 
    "sync" 
) 

var wg sync.WaitGroup 

func doTasks() { 
    fmt.Println(" Doing task ") 
    for ji := 1; ji < 100000000; ji++ { 
     for io := 1; io < 10; io++ { 
      //Some computations 
     } 
    } 
    runtime.Gosched() 

    wg.Done() 
} 

func main() { 
    wg.Add(1) 
    runtime.GOMAXPROCS(1) // or 2 or 4 
    go doTasks() 
    doTasks() 
    wg.Wait() 
} 
+0

Hệ điều hành nào bạn đang thử nghiệm tính năng này? Ngoài ra nó sẽ rất hữu ích để biết bạn sử dụng CPU nào. Tôi không thể tái tạo hành vi. – nemo

+0

cat/etc/* - trả về bản phát hành: Red Hat Enterprise Linux Workstation release 6.3 (Santiago). Hệ điều hành là Linux. CPU là CPU Intel (R) Xeon (R), X5460 @ 3.16GHz. NumCPU trả về 8. – user984260

+0

@nemo Chương trình chạy hoàn toàn tốt. Chỉ có tôi đã tò mò làm thế nào để xem số lượng bộ vi xử lý mà nó đang chạy – user984260

Trả lời

24

Số CPU hợp lý lớn nhất mà quy trình có thể chạy vào một thời điểm nhất định không được vượt quá mức tối thiểu runtime.GOMAXPROCS(0)runtime.NumCPU().

func MaxParallelism() int { 
    maxProcs := runtime.GOMAXPROCS(0) 
    numCPU := runtime.NumCPU() 
    if maxProcs < numCPU { 
     return maxProcs 
    } 
    return numCPU 
} 
+0

+1 điều này trông giống như một giải pháp đúng (hoặc ít nhất là thú vị). Nhưng bạn có một số nguồn về sự vắng mặt của những cách tốt hơn và bền hơn? –

+0

Không chắc chắn nếu đó chỉ là tôi, nhưng MaxParallelism trả về 0 trên Macbook Air 2011 của tôi và 8 máy chủ Intel lõi chạy Debian 7. workaround của tôi là sử dụng runtime.NumCPU trả về 4 cho MBA (2 chủ đề trên mỗi 2 lõi) và 8 CPU trên máy chủ (có 8 lõi XEON không tăng cường). Thử nghiệm được thực hiện với Go 1.2. –

+0

@PeterKrnjevic: Tôi không thể tái tạo điều này. Macbook air 10.9, đi 1.2. –

2

Số lõi có thể được hỏi bởi http://golang.org/pkg/runtime/#NumCPU.

Tài liệu nói: "NumCPU trả về số lượng CPU hợp lý trên máy cục bộ."

+1

Cảm ơn. Tuy nhiên, tôi muốn hỏi, làm thế nào để biết số CPU, mà chương trình hiện tại đang chạy. Con số này nhỏ hơn hoặc bằng NumCPU. – user984260