我尝试使用tpool来加速某些文件夹中大小在30到300 MiB之间的任何文件的shasum计算。 我在macOS Sierra 10.12.5上使用自制软件中的tcl-tk版本8.6.6(tcl-tk OS X版本是8.5.9,结果相同但是以错误终止)。 我可以理解命令“brew info tcl-tk”的结果,使用选项编译tcl: - 附线程 “使用多线程支持构建”
没有线程使用,很明显CPU负载(Activity Monitor)不是很忙。 使用tpool的线程,而不是更多,计算一组shasum文件的时间花费全局相同。
根据-maxworkers数量,perl5.18进程的全局%CPU(shasum是Perl脚本)是相同的。一切都发生好像所有同时工作的线程都在同一个处理器核心上运行。
根据Donald Fellows answer中的示例,参见下面的主要脚本:
#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec /usr/local/Cellar/tcl-tk/bin/tclsh "$0" ${1+"$@"}
package require Thread
set pool [tpool::create -maxworkers 16 -initcmd {
source myProcedures.tcl
}]
proc TREE_parse_big_files {path} {
foreach f [ glob -nocomplain ${path}/* ] {
puts "Parsing ${f}"
if { [ file type ${f} ] == "link" } { return }
if { [ file isdirectory ${f} ] } {
TREE_parse_big_files ${f}
} else {
tpool::post $::pool [list computeSHA ${f}]
}
}
}
TREE_parse_big_files “/tmp/BigFiles” $pool
# Dispose of the pool
tpool::release $pool
文件myProcedures.tcl包含:
proc computeSHA {bigFile} {
puts [eval exec shasum -a 256 -b {$bigFile}]
}
有什么我不理解的吗?