2013-07-25 47 views
24

Có đảm bảo rằng GOMAXPROCS được đặt thành 1 khi biến môi trường cùng tên không được đặt không?Giá trị mặc định GOMAXPROCS là gì

Mã này cho thấy giá trị:

package main 

import (
    "runtime" 
    "fmt" 
) 

func getGOMAXPROCS() int { 
    return runtime.GOMAXPROCS(0) 
} 

func main() { 
    fmt.Printf("GOMAXPROCS is %d\n", getGOMAXPROCS()) 
} 

và chạy nó như thế này:

$ GOMAXPROCS= go run max.go 
GOMAXPROCS is 1 

cho thấy rằng nó là 1 trong trường hợp này, nhưng tôi đang tìm kiếm một số xác nhận ở đây.

Trả lời

18

Không, không có gì đảm bảo về mặc định là gì; mặc dù tất cả các triển khai đã biết đều sử dụng giá trị '1'. Nếu mã của bạn, nếu không có biến môi trường, yêu cầu một giá trị mặc định cụ thể thì bạn nên đặt nó trong mã. Additionally:

GOMAXPROCS đặt số lượng CPU tối đa có thể thực hiện đồng thời và trả về cài đặt trước đó. Nếu n < 1, nó không thay đổi cài đặt hiện tại. Số lượng các CPU logic trên máy cục bộ có thể được truy vấn bằng NumCPU. Cuộc gọi này sẽ biến mất khi người lên lịch cải thiện.

(tôi nhấn mạnh)

+3

GOMAXPROCS không nên biến mất cho đến Go 2.0 sớm nhất, nếu không nó sẽ phá vỡ bảo đảm của Go 1: không có thay đổi nào về API sẽ phá vỡ hoặc thay đổi hành vi thư viện chuẩn trừ khi đó là sửa lỗi. Vì GOMAXPROCS hơi kỳ quặc và ảnh hưởng trực tiếp đến thời gian chạy nên nó có thể trở thành một gợi ý chứ không phải là một lệnh, nhưng nó sẽ không đột nhiên biến mất trên bạn trong Go 1.2 hoặc bất cứ thứ gì. – LinearZoetrope

+0

@Jsor Nếu GOMAXPROCS là để thay đổi hành vi của một cái gì đó nó sẽ âm thanh như một lỗi cho tôi? – inf

+0

@inf Nó sẽ không phải là một lỗi, bởi vì nó không ảnh hưởng đến ngữ nghĩa của ngôn ngữ (có nghĩa là, kết quả cuối cùng). Thời gian duy nhất nó có thể ảnh hưởng đến ngữ nghĩa là nếu bạn đang chơi với hành vi không xác định/bất hợp pháp như điều kiện chủng tộc để bắt đầu. Hãy nghĩ về GOMAXPROCS như chỉ thị 'inline' trong C++, trình biên dịch được phép bỏ qua nó bởi vì đôi khi nó biết tốt hơn bạn, nhưng nó cũng không ảnh hưởng đến kết quả cuối cùng trừ khi bạn đang làm những điều kỳ lạ. GOMAXPROCS là một chỉ thị thời gian chạy, nhưng áp dụng tương tự (mặc dù có những cân nhắc được thực hiện cho những thứ như OpenGL). – LinearZoetrope

8

Bắt đầu với Go 1.5, GOMAXPROCS được thiết lập để số CPU có sẵn theo mặc định. Tuy nhiên, bạn có thể đặt rõ ràng nó bằng biến môi trường GOMAXPROCS hoặc bằng cách gọi thời gian chạy.GOMAXPROCS.

https://docs.google.com/document/d/1At2Ls5_fhJQ59kDK2DFVhFu3g5mATSXqqV5QrxinasI/preview?sle=true

+3

Lưu ý đây là (hiện tại) chỉ có một đề xuất và ngay cả khi chấp nhận cài đặt mặc định có thể được hoàn nguyên về 1 nếu có vấn đề không lường trước được. –

21

Như Go 1.5 Release Notes nói

Theo mặc định, chương trình Go chạy với GOMAXPROCS thiết lập để số lượng lõi có sẵn; trong phiên bản trước nó mặc định để 1.

Vì vậy, bắt đầu từ Go 1.5, giá trị mặc định nên số của lõi.

+0

Điều gì sẽ xảy ra nếu GOMAXPROCS> số lõi –

+0

Bạn có thể kết thúc với Tải CPU cao hơn (nhiệm vụ chiến đấu cho thời gian CPU). – Sean