Channel Synchronization in Julia
Our example demonstrates how to use channels for synchronization between tasks. In Julia, we can achieve similar functionality using Channel
s and Task
s. Here’s the full source code:
using Printf
function worker(done::Channel{Bool})
@printf("working...")
sleep(1)
println("done")
# Send a value to notify that we're done
put!(done, true)
end
function main()
# Create a channel to notify on
done = Channel{Bool}(1)
# Start a worker task, giving it the channel to notify on
@async worker(done)
# Block until we receive a notification from the worker on the channel
take!(done)
end
main()
This is the function we’ll run in a task. The done
channel will be used to notify another task that this function’s work is done.
The main
function starts a worker task, giving it the channel to notify on. It then blocks until it receives a notification from the worker on the channel.
To run the program, save it as channel_synchronization.jl
and use:
$ julia channel_synchronization.jl
working...done
If you removed the take!(done)
line from this program, the program would exit before the worker
even started.
In Julia, we use Channel
s for communication between tasks, which are similar to goroutines in concept. The @async
macro is used to create and schedule a new task, analogous to the go
keyword. The put!
and take!
functions are used to send and receive values on a channel, respectively.