I've moved this question to stackoverflow https://stackoverflow.com/questions/50573586/perl6-an-operation-first-awaited
More comments inline below. On Tue, 29 May 2018 at 01:40, Brad Gilbert <b2gi...@gmail.com> wrote: > . > > An operation first awaited: > > in sub MAIN at ./traverse-dir0.p6 line 24 > > in block <unit> at ./traverse-dir0.p6 line 5 > > > > Died with the exception: > > Cannot find method 'path': no method cache and no .^find_method > > in block at ./traverse-dir0.p6 line 16 > > > > my $dir-read = start { > > $dir-channel.send( $_ ) for dir $dir; > > $dir-channel.close; > > } > > > > my @workers = (^$N).map: { > > start { > > while my $file = $dir-channel.receive() { > > say $file.path; > > } > > CATCH { > > when X::Channel::ReceiveOnClosed { .resume } > > ------------------------------ > > What did you expect to happen if you resumed? > > Because I expect it to try to run `say $file.path;` with invalid data. > You can just remove the `.resume` and it works. > Hmm, I was expecting the resume to make $dir-channel.receive() fail and hence the loop while my $file = $dir-channel.receive() to finish. That is control would not move to inside the while() loop. It seems not :-( I'll need to get my head around what is happening. . > > await $dir-read, @workers; > > } > > There is no need to await for $dir-read, as the workers won't finish > until it's done anyway. > Yep :-) > > --- > > Anyway I would use a `react` block. > Nice, I'll work on this. Thanks. My original intention was to rewrite my code with "back-pressure" on the dir() read thread. And then I got stuck on this error I'm posting about :-( > my @workers = (^$N).map: { > start react whenever $dir-channel -> $file { > say $file.path; > } > } > > Note that `start` and `react` don't need {}, but you can use them if > neccesary. > > > my @workers = (^$N).map: { > start { > say 'started'; > > react { > say 'reacting'; > > whenever Promise.in(½) { say '½ second has elapsed' } > > whenever $dir-channel -> $file { > say $file.path; > } > } > } > } >