Good question, I don't know ! Let's ask the creator of the language himself (Jütrg Billete)
Serge. On Wed, Jul 13, 2011 at 9:17 PM, august <[email protected]> wrote: > > I've been following this thread with interest. I also find the > documentation about async methods in vala to be a little thin. For > example, in the tutorial, the first line of description says: > > > "With asynchronous methods it is possible to do programming without > any blocking." > > The following examples in the tutorial are much more enlightening...so > it's not that bad. But, maybe it could be improved. > > > I always thought async methods: > a) are always single threaded > b) uses the glib runtime scheduler to simulate > multi-processes > c) cannot take advantage of multi-core or multi-processor > computers > > Is that correct? > > > Also, are there any plans to ease multi-core development in Vala? > > > thanks, best -august. > > > > Actually, this is Luca's code (the coroutine-based generator). > > > > (I am the guilty party to blame for the naive idea to try to add threads > to > > it : I had the Goroutine/channel concept of Go in mind and was trying to > > emulate it by attempting to combine Luca's generator with threads). > > > > :) > > > > Serge. > > > > > > > > On Wed, Jul 13, 2011 at 3:02 PM, Jim Peters <[email protected]> wrote: > > > > > Serge Hulne wrote: > > > > Here is a further development of the idea of Luca Bruno about a Vala > > > > implementation for Generators: > > > > > > > > Simulating Go's goroutines and channels in Vala: > > > > > > > > Basically the idea is to start as many threads as needed (which play > the > > > > role of Go' goroutines) and to recuperate their output from a > "Generator" > > > > (which plays the role of the "Go" channel form which the result from > a > > > given > > > > thread can be pulled): > > > > > > To clarify after all the confusion (partly my fault -- sorry): > > > > > > - Luco's Generator doesn't need threads, and it doesn't need a main > > > loop either, even though it is using 'async' > > > > > > - The whole thing runs in a single thread > > > > > > A few thoughts: > > > > > > - 'async' is really powerful in Vala, but also quite hard to > > > understand. (I wish I could find a high-level design document > > > explaining async in GIO.) > > > > > > - Its implementation of coroutines doesn't require another stack, it > > > holds its state in a private data structure. When it does a 'yield' > > > it returns to the caller, and when it is next given control, it > > > resumes the previous point of execution using a switch and 'goto'. > > > > > > - Probably it could all go a lot faster if less housekeeping was going > > > on, but I haven't seen Go's implementation either, so who knows how > > > it compares. Anyway, Vala always puts functionality first and > > > optimisation second, which suits people who want to get the job done > > > now instead of waiting for the ultimate language to arrive, so that > > > seems okay. > > > > > > Attached is a version of Serge's code with all the thread stuff cut > > > out, which still works. > > > > > > Jim > > > > > > ///////////////////////////////// > > > using Posix; > > > > > > abstract class Generator<G> { > > > private bool consumed; > > > private unowned G value; > > > private SourceFunc callback; > > > > > > public Generator () { > > > helper (); > > > } > > > > > > private async void helper () { > > > yield generate (); > > > consumed = true; > > > } > > > > > > protected abstract async void generate (); > > > > > > protected async void feed (G value) { > > > this.value = value; > > > this.callback = feed.callback; > > > yield; > > > } > > > > > > public bool next () { > > > return !consumed; > > > } > > > > > > public G get () { > > > var result = value; > > > callback (); > > > return result; > > > } > > > > > > public Generator<G> iterator () { > > > return this; > > > } > > > } > > > > > > class IntGenerator : Generator<int> { > > > protected override async void generate () { > > > for (int i=0; i < 10; i++) { > > > if (i%2 ==0) yield feed (i); > > > } > > > } > > > } > > > > > > class IntGenerator_1 : Generator<int> { > > > protected override async void generate () { > > > for (int i=0; i < 10; i++) { > > > if (i%2 !=0) yield feed (i); > > > } > > > } > > > } > > > > > > int main(string[] args) { > > > > > > var gen = new IntGenerator(); > > > var gen_1 = new IntGenerator_1(); > > > > > > print("\n\nResults computed in first generator\n"); > > > > > > var i=0; > > > foreach (var item in gen) { > > > if (i<10) Posix.stdout.printf("%i\n", item); > > > i++; > > > } > > > > > > print("\n\nResults computed in the second generator\n\n"); > > > > > > i=0; > > > foreach (var item in gen_1) { > > > if (i<10) Posix.stdout.printf("%i\n", item); > > > i++; > > > } > > > > > > return 0; > > > } > > > > > > ///////////////////////////////// > > > > > > -- > > > Jim Peters (_)/=\~/_(_) [email protected] > > > (_) /=\ ~/_ (_) > > > Uazú (_) /=\ ~/_ (_) http:// > > > in Peru (_) ____ /=\ ____ ~/_ ____ (_) uazu.net > > > > > > _______________________________________________ > > vala-list mailing list > > [email protected] > > http://mail.gnome.org/mailman/listinfo/vala-list > > > -- > ------------------- > http://aug.ment.org > > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.10 (GNU/Linux) > > iQEVAwUBTh3vN8VXRY8APmlSAQJqjQf/aQ1bOVQFYuVwwRJrVZtlLe8EYZ4mr7mM > s/OSZcomk9tenAe2zTonUz4p8mmJqSA6JnBxEabX3DY8TlohDrQxuiYySoLwK0DE > kVDt8qiGxXCOH+HHYKeunG4NsNnhI4f/spaKyoe4t/oLCpMZRkoxenUE3y+dpoF7 > eRFngk27g9dQRFPwPwsjuTtoA+LdkUvCYp7ST+C6YSybTcvwMyQKm2bm/wxjVzvR > zMusKCs+DehYXf12r/rt7I7BdxBK7bofpwryN0m5iFWEf9ZC3YvCNxJRahEmcfja > WSAVJHQI7Im4t3wxM0VCJKPgxe3zwYqdj9kgO6NjH2//DhFw1ILL0A== > =mrFz > -----END PGP SIGNATURE----- > >
_______________________________________________ vala-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/vala-list
