Multithreading 如何在tpool initcmd中访问本地过程
我在本地文件中编写了一系列本地过程,并且我正在使用相同的文件创建tpool,我试图访问tpool body中的几个本地过程,但没有从本地过程中获得结果 但是我可以执行init body,但是本地过程不能从tpool调用,是否有任何机制可以访问本地过程Multithreading 如何在tpool initcmd中访问本地过程,multithreading,tcl,Multithreading,Tcl,我在本地文件中编写了一系列本地过程,并且我正在使用相同的文件创建tpool,我试图访问tpool body中的几个本地过程,但没有从本地过程中获得结果 但是我可以执行init body,但是本地过程不能从tpool调用,是否有任何机制可以访问本地过程 package require Thread package require tdom proc proc1 {response xpath} { set doc "" set root "" set node ""
package require Thread
package require tdom
proc proc1 {response xpath} {
set doc ""
set root ""
set node ""
.....
}
proc proc2 {response xpath} {
set doc ""
set root ""
set node ""
.....
}
proc proc3 {one two} {
set res1 proc1 $one
set res2 proc2 $two
.....
}
set startMyProc {
proc download {one two three four} {
set res [proc3 $one $two $three $four]
}
}
proc Threaded {one two three four} {
variable startMyProc
set pool [tpool::create -maxworkers 10 -initcmd $startMyProc]
# Sent the work into the pool as distinct jobs
set jobs [list]
for {set i 0} {$i < [llength $one]} {incr i} {
lappend jobs [tpool::post -nowait $pool [list download [lindex $one $] $two $three $four]]
}
while {[llength $jobs] > 0} {
tpool::wait $pool $jobs jobs
}
tpool::release $pool
}
Threaded xxx xxx xxx xxxx
包需要线程
包需要时差
proc proc1{response xpath}{
设置文档“”
设置根“”
设置节点“”
.....
}
proc proc2{response xpath}{
设置文档“”
设置根“”
设置节点“”
.....
}
proc proc3{1 2}{
设置res1 proc1$1
设置res2 proc2$2
.....
}
设置startMyProc{
程序下载{一二三四}{
设置res[proc3$1$2$3$4]
}
}
proc线程化{1 2 3 4}{
可变startMyProc
设置池[tpool::create-maxworkers 10-initcmd$startMyProc]
#将工作作为不同的作业发送到池中
设置作业[列表]
对于{set i 0}{$i<[l长度$1]}{incr i}{
lappend jobs[tpool::post-nowait$pool[列表下载[lindex$one$]$two$three$four]]
}
而{[llength$jobs]>0}{
tpool::wait$pool$jobs
}
tpool::release$pool
}
螺纹xxx xxx xxx xxxx
谢谢
Malli有几个小问题。变量startMyProc应该包含线程的所有代码。您现在拥有的一个在变量之外的进程是不可访问的。此外,您还应该在初始进程中放置一个catch,以帮助您在线程中找到这样的错误
set startMyProc {
proc proc1 {response xpath} {
set doc ""
set root ""
set node ""
}
proc proc2 {response xpath} {
set doc ""
set root ""
set node ""
}
proc proc3 {one two} {
puts "proc3"
set res1 proc1 $one
set res2 proc2 $two
}
proc download {one two three four} {
if {[catch {
set res [proc3 $one $two $three $four]
} err]} {
puts $err
}
}
}
由于某些原因,当主线程关闭时,线程仍在运行或清理。将其添加到主脚本的底部,使其保持打开状态,直到ctrl-c。你必须弄清楚如何在线程结束时轻轻关闭,但这将暂时解决你的问题
vwait forever
一些小问题。变量startMyProc应该包含线程的所有代码。您现在拥有的一个在变量之外的进程是不可访问的。此外,您还应该在初始进程中放置一个catch,以帮助您在线程中找到这样的错误
set startMyProc {
proc proc1 {response xpath} {
set doc ""
set root ""
set node ""
}
proc proc2 {response xpath} {
set doc ""
set root ""
set node ""
}
proc proc3 {one two} {
puts "proc3"
set res1 proc1 $one
set res2 proc2 $two
}
proc download {one two three four} {
if {[catch {
set res [proc3 $one $two $three $four]
} err]} {
puts $err
}
}
}
由于某些原因,当主线程关闭时,线程仍在运行或清理。将其添加到主脚本的底部,使其保持打开状态,直到ctrl-c。你必须弄清楚如何在线程结束时轻轻关闭,但这将暂时解决你的问题
vwait forever