假的长时间运行的程序:
proc long_job {} {
puts "long_job start"
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 1s start"
after 1000
puts "- after 2s start"
after 2000
puts "long_job end"
}
long_job
实现:
namespace eval my {}
proc my_jobReader {pipe} {
if [eof $pipe] {
if [catch {close $pipe} err] {
puts $err
set my::jobError "true"
}
set my::jobDone "true"
return
}
puts [gets $pipe]
}
proc my_doJob {job} {
set my::jobDone "false"
set my::jobError "false"
set pipe [open |$job]
fileevent $pipe readable [list my_jobReader $pipe]
vwait my::jobDone
if {$my::jobError == "true"} {
return -code error
}
}
puts "general run"
catch {exec tclsh long_job.tcl} out
puts $out;
puts "general run end"
puts ""
puts ""
puts ""
puts "do my_doJob"
my_doJob {tclsh long_job.tcl}
puts "do my_doJob end"
运行:
tclsh t.tcl
可以发现,general run是运行完才打印的。
使用my_doJob可以运行同时打印。
本文展示了一个使用TCL编写的简单并发程序示例。该示例通过创建一个长时间运行的任务,并采用非阻塞的方式读取任务输出,实现了任务执行与输出读取的并行处理。这种方式有助于提高程序的效率和响应速度。
3万+

被折叠的 条评论
为什么被折叠?



