Posted to tcl by bairui at Sun Feb 14 05:14:56 GMT 2016view raw
- #! /usr/bin/env tclsh
- # Barry Arthur, Feb 2016
- # butchered from http://wiki.tcl.tk/2770
- # synopsis:
- # script path [path...]
- # Prints the system du information for each path given on the
- # command line.
- # NOTE: This is only a toy for playing with threads
- # There MUST be some wrong approaches in this code,
- # and I'm looking for feedback & corrections.
- package require Thread
- package require struct::list
- set du_job_count 0
- set runner 0
- set runner_count 3
- foreach x [struct::list iota $runner_count] {
- set runners($x) [thread::create {
- proc run {caller_id command} {
- try {
- set result [{*}$command]
- } on error {result opts} {
- # spurious, fragile and specific to du command on linux
- set result [concat {*}[lrange [split $result "\n"] end-1 end-1]]
- }
- thread::send -async $caller_id [list ::print_result $result]
- }
- thread::wait
- }]
- }
- proc print_result result {
- puts $result
- incr ::du_job_count -1
- if {$::du_job_count == 0} {
- set ::done 1
- }
- }
- proc du {path} {
- global runners runner_count runner du_job_count
- incr du_job_count
- set runner [expr [incr runner] % $runner_count]
- set command_string "exec -ignorestderr du -sk"
- lappend command_string $path
- lappend command_string "2>/dev/null"
- thread::send -async $runners($runner) [list run [thread::id] $command_string]
- }
- lmap path $argv {du $path}
- vwait done
Comments
Posted by apn at Sun Feb 14 05:59:57 GMT 2016 [text] [code]
set promises [lmap path $paths { promise::pexec du -sk $path }] set all_done [promise::all $promises] $all_done then [promise::lambda {outputs} { foreach output $outputs {puts $output} }]
Posted by apn at Sun Feb 14 06:03:44 GMT 2016 [text] [code]
See http://www.magicsplat.com/blog/promises-by-example/ for more info