The application is hanging and you have no idea what’s going on. You’ve watched the videos, you’ve read the documentation, and you’re just not getting it.

If you’re struggling to wrap your head around Go’s concurrency primitives then you are not alone.

The internet is chock-full of excellent resources explaining and demonstrating concurrency in Go, but if your brain is overflowing, then perhaps it’s time to take a step back from the deadlocks and the race conditions, strip away real-world concerns like http and filesystems and parsing, and solve some toy problems.

These exercises tackle three concurrency-related problems. The basic concepts are the same whether you’re dealing with multiplexing and reverse proxies or cupcakes and zombies.

There are probably several correct approaches to each of these exercises, and (of course) a multitude of incorrect ones.

Exercise 1: The Daily Walk

Every morning, Alice and Bob go for a walk, and being creatures of habit, they follow the same routine every day.

First, they both prepare, grabbing sunglasses, perhaps a belt, closing open windows, turning off ceiling fans, and pocketing their phones and keys.

Once they’re both ready, which typically takes each of them between 60 and 90 seconds, they arm the alarm, which has a 60 second delay.

While the alarm is counting down, they both put on their shoes, a process which tends to take each of them between 35 and 45 seconds.

Then they leave the house together and lock the door, before the alarm has finished its countdown.

Write a program to simulate Alice and Bob’s morning routine.

Here’s some sample output from running a solution to this problem.

Let's go for a walk! Bob started getting ready Alice started getting ready Alice spent 72 seconds getting ready Bob spent 76 seconds getting ready Arming alarm. Bob started putting on shoes Alarm is counting down. Alice started putting on shoes Alice spent 37 seconds putting on shoes Bob spent 39 seconds putting on shoes Exiting and locking the door. Alarm is armed.

Exercise 2: Eating Tapas

Four friends are having dinner together. They ordered five dishes to share, each of which consists of between 5 and 10 morsels.

They eat leisurely, spending between 30 seconds and 3 minutes eating each morsel.

Write a program to simulate the meal.

Running the program might look something like this:

Bon appétit! Alice is enjoying some chorizo Bob is enjoying some chopitos Charlie is enjoying some pimientos de padrón Dave is enjoying some croquetas Alice is enjoying some patatas bravas Charlie is enjoying some chorizo Dave is enjoying some chopitos Alice is enjoying some pimientos de padrón Bob is enjoying some croquetas Dave is enjoying some patatas bravas Alice is enjoying some chorizo Bob is enjoying some chopitos Charlie is enjoying some pimientos de padrón Alice is enjoying some croquetas Bob is enjoying some patatas bravas Dave is enjoying some chorizo Charlie is enjoying some chopitos Alice is enjoying some pimientos de padrón Dave is enjoying some patatas bravas Charlie is enjoying some croquetas Bob is enjoying some chorizo Alice is enjoying some chopitos Charlie is enjoying some pimientos de padrón Charlie is enjoying some patatas bravas Dave is enjoying some croquetas Alice is enjoying some chorizo Bob is enjoying some chopitos Bob is enjoying some pimientos de padrón Charlie is enjoying some patatas bravas Alice is enjoying some chopitos Dave is enjoying some patatas bravas Charlie is enjoying some chopitos Alice is enjoying some patatas bravas Bob is enjoying some patatas bravas Dave is enjoying some patatas bravas That was delicious!

Exercise 3: Internet Café

A small internet café in a village just outside of Manilla has 8 computers, which are available on a first-come first-serve basis. When all the computers are taken, the next person in line has to wait until a computer frees up.

This morning several groups of tourists, 25 people in all, are waiting when the doors open.

Each person spends between 15 minutes and 2 hours online.

Write a program to simulate the computer usage at the café

Sample output:

Tourist 4 is online. Tourist 25 is online. Tourist 9 is online. Tourist 15 is online. Tourist 1 is online. Tourist 16 is online. Tourist 2 is online. Tourist 5 is online. Tourist 17 waiting for turn. Tourist 6 waiting for turn. Tourist 3 waiting for turn. Tourist 18 waiting for turn. Tourist 7 waiting for turn. Tourist 12 waiting for turn. Tourist 13 waiting for turn. Tourist 10 waiting for turn. Tourist 19 waiting for turn. Tourist 14 waiting for turn. Tourist 11 waiting for turn. Tourist 20 waiting for turn. Tourist 22 waiting for turn. Tourist 23 waiting for turn. Tourist 24 waiting for turn. Tourist 8 waiting for turn. Tourist 21 waiting for turn. Tourist 2 is done, having spent 15 minutes online. Tourist 17 is online. Tourist 5 is done, having spent 18 minutes online. Tourist 6 is online. Tourist 15 is done, having spent 40 minutes online. Tourist 3 is online. Tourist 16 is done, having spent 41 minutes online. Tourist 18 is online. Tourist 6 is done, having spent 40 minutes online. Tourist 7 is online. Tourist 4 is done, having spent 60 minutes online. Tourist 12 is online. Tourist 17 is done, having spent 64 minutes online. Tourist 13 is online. Tourist 1 is done, having spent 88 minutes online. Tourist 10 is online. Tourist 9 is done, having spent 100 minutes online. Tourist 19 is online. Tourist 25 is done, having spent 114 minutes online. Tourist 14 is online. Tourist 19 is done, having spent 24 minutes online. Tourist 11 is online. Tourist 7 is done, having spent 88 minutes online. Tourist 20 is online. Tourist 18 is done, having spent 107 minutes online. Tourist 22 is online. Tourist 3 is done, having spent 110 minutes online. Tourist 23 is online. Tourist 12 is done, having spent 100 minutes online. Tourist 24 is online. Tourist 13 is done, having spent 87 minutes online. Tourist 8 is online. Tourist 20 is done, having spent 26 minutes online. Tourist 21 is online. Tourist 11 is done, having spent 65 minutes online. Tourist 24 is done, having spent 32 minutes online. Tourist 8 is done, having spent 28 minutes online. Tourist 10 is done, having spent 110 minutes online. Tourist 23 is done, having spent 57 minutes online. Tourist 14 is done, having spent 98 minutes online. Tourist 22 is done, having spent 106 minutes online. Tourist 21 is done, having spent 111 minutes online. The place is empty, let's close up and go to the beach!

Notes

Use time.Sleep() to simulate delays and activities.

Remember to seed math/rand so that people’s activities (eating morsels and putting on shoes) take different amounts of time each time you run the code.

The exercises were inspired by William Kennedy’s post The Nature Of Channels In Go.

Stuck?

If you get stuck, ask for help on IRC or Slack, or try the Go Forum at GolangBridge.