如何在tcl中找到CPU的数量?

时间:2015-04-07 01:34:06

标签: tcl

我使用的软件支持多线程和TCL接口。所以我不确定如何在TCL中找到CPU的数量来限制最大线程数。

3 个答案:

答案 0 :(得分:3)

Tcl没有内置任何东西;已经讨论过了,但没有采取行动,因为CPU的数量不一定是进程可能使用的的数量(到目前为止,获取信息的最相关原因)。也就是说,信息可用。只是您获取信息的方式因平台而异。

proc numberOfCPUs {} {
    # Windows puts it in an environment variable
    global tcl_platform env
    if {$tcl_platform(platform) eq "windows"} {
        return $env(NUMBER_OF_PROCESSORS)
    }

    # Check for sysctl (OSX, BSD)
    set sysctl [auto_execok "sysctl"]
    if {[llength $sysctl]} {
        if {![catch {exec {*}$sysctl -n "hw.ncpu"} cores]} {
            return $cores
        }
    }

    # Assume Linux, which has /proc/cpuinfo, but be careful
    if {![catch {open "/proc/cpuinfo"} f]} {
        set cores [regexp -all -line {^processor\s} [read $f]]
        close $f
        if {$cores > 0} {
            return $cores
        }
    }

    # No idea what the actual number of cores is; exhausted all our options
    # Fall back to returning 1; there must be at least that because we're running on it!
    return 1
}

请注意,如果您要查找要运行的CPU数量,您真正想要的是CPU亲和力掩码中设置的位数。不幸的是,在大多数平台上检索这些信息都是非常重要的。

答案 1 :(得分:1)

我尝试了上述两种解决方案。 @DonalFellows几乎是完美的但是在我的OSX上没有工作,因为默认的tclsh是8.4而且exec的{*}语法不起作用。但是,{*}构造似乎并不需要,因为删除它使其能够与tclsh 8.4,8.5和8.6一起使用。

我已经将下面的代码粘贴了,因为我没有足够的声誉来评论。

proc numberOfCPUs {} {
    # Windows puts it in an environment variable
    global tcl_platform env
    if {$tcl_platform(platform) eq "windows"} {
        return $env(NUMBER_OF_PROCESSORS)
    }

    # Check for sysctl (OSX, BSD)
    set sysctl [auto_execok "sysctl"]
    if {[llength $sysctl]} {
        if {![catch {exec $sysctl -n "hw.ncpu"} cores]} {
            return $cores
        }
    }

    # Assume Linux, which has /proc/cpuinfo, but be careful
    if {![catch {open "/proc/cpuinfo"} f]} {
        set cores [regexp -all -line {^processor\s} [read $f]]
        close $f
        if {$cores > 0} {
            return $cores
        }
    }

    # No idea what the actual number of cores is; exhausted all our options
    # Fall back to returning 1; there must be at least that because we're running on it!
    return 1
}

答案 2 :(得分:0)

该代码最初来自@DonalFellows的回答。但我仍然对sysctl中存在的Ubuntu产生问题,但它没有hw.ncpu

所以我做了一些改变。

proc number_of_processor {} {
    global tcl_platform env
    switch ${tcl_platform(platform)} {
        "windows" { 
            return $env(NUMBER_OF_PROCESSORS)       
        }

        "unix" {
            if {![catch {open "/proc/cpuinfo"} f]} {
                set cores [regexp -all -line {^processor\s} [read $f]]
                close $f
                if {$cores > 0} {
                    return $cores
                }
            }
        }

        "Darwin" {
            if {![catch {exec {*}$sysctl -n "hw.ncpu"} cores]} {
                return $cores
            }
        }

        default {
            puts "Unknown System"
            return 1
        }
    }
}

UbuntuWindows 7上尝试,它有效。我周围没有MacOS。如果有人可以验证是否有效,那将是件好事。