Posted to tcl by bairui at Sat Apr 29 23:27:30 GMT 2017view raw

  1. package require Thread
  2.  
  3. set unfinished_work {1 2 3 4 5 6 7 8 9 10}
  4. set finished_work {}
  5. set n_workers 7
  6. set workers {}
  7.  
  8. set pool [tpool::create -maxworkers $::n_workers -initcmd {
  9. proc do_work {work} {
  10. puts "Worker doing $work"
  11. after 1000 ;# simulate workload
  12. return [list [expr int(rand() * 10) * $work] [tsv::incr sync result]]
  13. }
  14. }]
  15.  
  16. foreach work $unfinished_work {
  17. lappend workers [tpool::post $pool [list do_work $work]]
  18. }
  19.  
  20. foreach worker $workers {
  21. set job [tpool::wait $pool $worker]
  22. puts "Main collecting job $job"
  23. lappend finished_work [tpool::get $pool $job]
  24. }
  25.  
  26. puts "Main finished: $finished_work"
  27.