RosettaCodeData/Task/Rendezvous/Julia/rendezvous.julia
2019-09-12 10:33:56 -07:00

74 lines
2.3 KiB
Text

mutable struct Printer
inputpath::Channel{String}
errorpath::Channel{String}
inkremaining::Int32
reserve::Printer
name::String
function Printer(ch1, ch2, ink, name)
this = new()
this.inputpath = ch1
this.errorpath = ch2
this.inkremaining = ink
this.name = name
this.reserve = this
this
end
end
function lineprintertask(printer)
while true
line = take!(printer.inputpath)
linesprinted = 0
if(printer.inkremaining < 1)
if(printer.reserve == printer)
put!(printer.errorpath, "Error: printer $(printer.name) out of ink")
else
put!(printer.reserve.inputpath, line)
end
else
println(line)
printer.inkremaining -= 1
end
end
end
function schedulework(poems)
printerclose(printer) = (close(printer.inputpath); close(printer.errorpath))
reserveprinter = Printer(Channel{String}(1), Channel{String}(10), 5, "Reserve")
mainprinter = Printer(Channel{String}(1), Channel{String}(10), 5, "Main")
mainprinter.reserve = reserveprinter
@async(lineprintertask(mainprinter))
@async(lineprintertask(reserveprinter))
printers = [mainprinter, reserveprinter]
activeprinter = 1
@sync(
for poem in poems
activeprinter = (activeprinter % length(printers)) + 1
@async(
for line in poem
put!(printers[activeprinter].inputpath, line)
end)
end)
for p in printers
while isready(p.errorpath)
println(take!(p.errorpath))
end
printerclose(p)
end
end
const humptydumpty = ["Humpty Dumpty sat on a wall.",
"Humpty Dumpty had a great fall.",
"All the king's horses and all the king's men,",
"Couldn't put Humpty together again."]
const oldmothergoose = ["Old Mother Goose,",
"When she wanted to wander,",
"Would ride through the air,",
"On a very fine gander.",
"Jack's mother came in,",
"And caught the goose soon,",
"And mounting its back,",
"Flew up to the moon."]
schedulework([humptydumpty, oldmothergoose])