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;
>                 }
>             }
>         }
>     }
>

Reply via email to