Execute in Parallel and Wait
fileevent is often recommended for execution of multiple processes in parallel, but it requires a script to be written in an event-driven style. Sometimes what is wanted is to execute multiple processes which run in parallel, and wait for them all to complete. Here is an example of that:
#! /bin/env tclsh proc main {} { for {set i 0} {$i < 5} {incr i} { set script { #simulate a hard-working process for {set i 0} {$i < 10000000} {incr i} { } puts [list hello from [pid]] } set chan [open |[list [info nameofexecutable] <<$script 2>@stderr]] dict set res $chan command $script fconfigure $chan -blocking 0 lappend background $chan } while 1 { foreach chan $background { if {[eof $chan]} { if {[set idx [lsearch -exact $background $chan]] >= 0} { set background [lreplace $background $idx $idx] } catch [close $chan] cres copts dict set res $chan result $cres dict set res $chan options $copts } else { puts -nonewline [read $chan] } } if {[llength $background] == 0} { break } after 100 } return $res } #puts [main] main
In contrast with some other solutions, TclX's wait, this example does not require any extension, and should work on various platforms.
Windows users, who typically start a script by double-clicking on the icon, running it in wish, should note that spawning the scripts might be problematic, for reasons discussed under the heading "Windows Console" on the exec page. Two possible solutions are