Как правило, любые пользовательские процедуры (или C команды), которые вы создаете в главном интерпретаторе, не также создаются в интерпретаторах других потоков. Вы можете использовать ttrace
system пакета Thread для репликации, но вам нужно явно загружать любые дополнительные команды C, которые вам нужны. (Я предпочитаю просто помещать все необходимое в пакеты, а затем просто package require
в каждом рабочем потоке, как требуется, но это более сложно.)
package require Ttrace
# Procedures created in here get replicated to current and future threads
ttrace::eval {
# Wrapper proc for executing passed procedure list
proc eval_procs {dut_no procList} {
telnet_dut $dut_no ;# proc to change telnet id to $dut_no
puts "thread id: [thread::id]"
foreach procedure [join [list $procList]] {
eval [join $procedure]
}
}
# You probably need to create the other commands here; I don't know your code, but you can source them just fine
}
# Now, the rest of your code as normal.
for {set i 0} {$i <= 1} {incr i} {
lappend jointhreadIds [thread::create]
}
set dutList [list 1 2]
set dutConfigList [list [list "get_port_statistics_mt 1"] [list "c_get_port_statistics_mt 2"]]; #proc for getting port statistics from switch 1 and 2
for {set i 0} {$i <= 1} {incr i} {
thread::send -async [lindex $jointhreadIds $i] [eval_procs [lindex $dutList $i] [lindex $dutConfigList $i]]
}
Обратите внимание, что у вас, вероятно, есть и другие ошибки. И эта последняя команда меня оскорбляет, так как она должна использовать многостраничный список foreach
и собирать команду для go для другого потока с list
. Здесь я имею в виду что-то вроде этого:
foreach t_id $joinThreadIds dut_no $dutList dut_config $dutConfigList {
# I've split the next line in two for even more clarity
thread::send -async $t_id [list \
eval_procs $dut_no $dut_config]
}