First of all: Sorry if this topic is duplicated, but couldn’t find it
Reading Crystal’s guide about Concurrency saw the following example, in the section “Spawning a fiber and waiting for it to complete”
channel = Channel(Nil).new spawn do puts "Before send" channel.send(nil) puts "After send" end puts "Before receive" channel.receive puts "After receive"
The expected output in the example is:
Before receive Before send After receive
But my output, locally, with Crystal 0.35.1, is:
Before receive Before send After send After receive
I’ve been told that the guide needs an update about how this should work. Also saw this Issue on GitHub about the topic.
The docs need to be updated or either say that the order of the result depends on the implementation and one shouldn’t rely on it. This is not a bug.
I’m missing the reasoning about this change, because I think that ensuring the execution order is crucial when working with Channels.
I would expect the example to work exactly as the guide. Whatever comes after
receive should be executed always before the statements that come after
send. The text “After send” shouldn’t even be printed.
Why this change? Am I missing something?
Thanks in advance.
EDIT: My opinion on this got an update, check reply below.