Nice work! Quick one though, `runtime.GOMAXPROCS` is a runtime level command that sets the number of processors for the entire program, not the function. It shouldn't really appear in a pkg as it will impact the calling program. Also, it will be removed at some point.

I would use the waitgroup as @e-dard suggested. The nice thing about that is you can then reliably use the closed/drained status to move on even if you don't know how many pieces of data are on the channel (e.g. if one fails to send, etc). 

```go
// Process data and send on channel
// ...
close(ch) // close the channel
for {
		if v, ok := <- ch; ok {
			// v = value, ok = true			
		} else {
			// v = nil, ok = false
			break // no more data, ch is drained and closed
		}
	}
```

Full example here (note: play.golang is a single CPU):
http://play.golang.org/p/XT9gH_Gkex