Multithreading 如何在tpool initcmd中访问本地过程

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 ""

我在本地文件中编写了一系列本地过程,并且我正在使用相同的文件创建tpool,我试图访问tpool body中的几个本地过程,但没有从本地过程中获得结果

但是我可以执行init body,但是本地过程不能从tpool调用,是否有任何机制可以访问本地过程

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