The often overlooked Linda / tuple spaces / JavaSpaces provides a coordination mechanism which is simple, by value, and expressively able to implement anything from CSP channels to pub/sub and more in a single process or multiple distributed processes, depending on the implementation.
e.g. see the QIX OS use of “kernel linda”
That there are pros/cons of things like callback-oriented programming, kernel threads, etc. is of course not a new topic, but I found this a quite readable (and not too dry) overview, thanks!
The invention of the concurrent, sequential processes model was by Dijkstra. He laid all the groundwork. Then, Hansen extended it in early 70’s as he implemented it in a language (Concurrent Pascal) and several operating systems. Hoare came up with CSP model afterward. Then, Hansen developed Joyce language (1988) that extended Pascal to use channels and abstract machines that implement CSP model. A lot of ground in concurrency safety at language level was covered before Go. Didn’t do asynchronous that I’m aware of. Hansen’s excellent publications on such things are below:
I’m surprised the author didn’t close the loop at the end. They got back to passing continuations-as-values, but didn’t spell out the final realization that this is again promises/futures and observable/stream.