我使用的软件支持多线程和TCL接口。所以我不确定如何在TCL中找到CPU的数量来限制最大线程数。
答案 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
}
}
}
在Ubuntu
和Windows 7
上尝试,它有效。我周围没有MacOS。如果有人可以验证是否有效,那将是件好事。