Use one channel per neighbor and have a wait all primitive that wakes the coroutine when all its inputs are ready. I don't know if go has such a primitive and if its implementation is optimized in such a way or simply waits for each channel in sequence.