Skip to content

Instantly share code, notes, and snippets.

@DmitrySoshnikov
Created October 10, 2011 09:58
Show Gist options
  • Save DmitrySoshnikov/1274980 to your computer and use it in GitHub Desktop.
Save DmitrySoshnikov/1274980 to your computer and use it in GitHub Desktop.
Dart's isolate test
class Printer extends Isolate {
main() {
port.receive((message, replyTo) {
if (message == null) port.close();
else print(message);
});
}
}
main() {
// first isolate process
new Printer().spawn().then((port) {
for (var message in ['Hello', 'from', 'other', 'isolate']) {
port.send(message);
}
port.send(null);
});
// second isolate process
new Printer().spawn().then((port) {
for (var message in ['*Hello', '*from', '*other', '*isolate']) {
port.send(message);
}
port.send(null);
});
}
// Results (WTF?)
Hello
from
other
isolate
*Hello
*from
*other
*isolate
// Why the output is sequential but not parallel? How the Dart's processes' scheduler work?
@DmitrySoshnikov
Copy link
Author

isopov yes, really strange results. On my machine your tests often do not finish completely -- i.e. only output from first or second process, but sometimes -- both. So, definitely there are still bugs in this module. Thus, this is regardless whether I use your sleep function or comment it (btw, the sleep method you wrote is blocking).

@FreakTheMighty
Copy link

This is outside the scope of the current conversation regarding light and heavy isolates. My question is more basic; the syntax is confusing me. What exactly are we passing in as an argument to "then"? I think mostly "(port)" is throwing me off.

new Printer().spawn().then((port) {
for (var message in ['Hello', 'from', 'other', 'isolate']) {
port.send(message);
}
port.send(null);
});

@FreakTheMighty
Copy link

Ahh I see now that its an anonymous function, so once the Isolate is spawned the unnamed functions is called with port as the argument.

http://www.dartlang.org/articles/idiomatic-dart/

@kaisellgren
Copy link

This makes no sense. spawn indicates there's an internal scheduler involved, which would make me believe the loops run in parallel causing results not to be in a sequence.

@DmitrySoshnikov
Copy link
Author

FreakTheMighty, right, it's an anonymous callback function.

kaisellgren, yes, the same I thought (after programming in Erlang and having implemented similar scheduled processes in JS with yield -- https://gist.github.com/1127536). However, after analyzing the source code of Dart's runtime library, I figured out that it's a design decision caused by impossibility of implementation of such parallel processes with using just setTimeout scheduling (you may check btw, my similar setTimeout processes -- https://gist.github.com/1103751). That is, callback process function should run to completeness and can't be interrupted in the middle. And exactly this cases sequential execution, but not parallel.

Recently I discussed the topic in Dart's mailing list: http://bit.ly/n3IUiT

@kaisellgren
Copy link

@DmitrySoshnikov: as far as I know, most ES engines do not support yield, except *Monkey. Therefore, I also believe the Dart engineers decided it is not possible to support "parallel processes" in transcompiled JS and this is the outcome :(. By the way, I like https://gist.github.com/1127536, did something similar once as well :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment