RosettaCodeData/Task/Checkpoint-synchronization/Wren/checkpoint-synchronization....

42 lines
1.2 KiB
Plaintext

import "random" for Random
import "scheduler" for Scheduler
import "timer" for Timer
import "./ioutil" for Input
var rgen = Random.new()
var nWorkers = 0
var nTasks = 0
var nFinished = 0
var worker = Fn.new { |id|
var workTime = rgen.int(100, 1000) // 100..999 msec.
System.print("Worker %(id) will work for %(workTime) msec.")
Timer.sleep(workTime)
nFinished = nFinished + 1
System.print("Worker %(id) is ready.")
}
var checkPoint = Fn.new {
while (nFinished != nWorkers) {
Timer.sleep(10)
}
nFinished = 0 // reset
}
var runTasks = Fn.new {
for (i in 1..nTasks) {
System.print("\nStarting task number %(i).")
var first = rgen.int(1, nWorkers + 1) // randomize first worker to start
// schedule other workers to start while another fiber is sleeping
for (j in 1..nWorkers) {
if (j != first) Scheduler.add { worker.call(j) }
}
worker.call(first) // start first worker
checkPoint.call() // start checkPoint
}
}
nWorkers = Input.integer("Enter number of workers to use: ", 1)
nTasks = Input.integer("Enter number of tasks to complete: ", 1)
runTasks.call()