develooper Front page | perl.perl6.users | Postings from April 2022

Re: Help with promises, supplies and channels.

Thread Previous | Thread Next
From:
David Emanuel da Costa Santiago
Date:
April 7, 2022 09:28
Subject:
Re: Help with promises, supplies and channels.
Message ID:
b81a872a-e06e-21ed-bcd1-741b2fccfd1b@gmail.com

Thanks for the information!

I opened a bug in rakudo:

https://github.com/rakudo/rakudo/issues/4853


Regards,
David Santiago


Às 05:27 de 07/04/22, yary escreveu:
> For what it's worth, I'm on a mac, promise_test.raku hangs for me once 
> in a while also.
> 
> Welcome to Rakudo(tm) v2021.04.
> Implementing the Raku(tm) programming language v6.d.
> Built on MoarVM version 2021.04.
> 
> Trying to reduce it, I would like to find a program that reliably 
> tickles this bug and hangs every time... this variation does not crash 
> for me (I ran it 100x)
> 
> ### close_much.raku ###
> my Channel $ch .= new;
> 
> my @proms = (1..2000).map: {
>      start react {
>         whenever $ch.closed { done }
>      }
> };
> 
> $ch.close;
> 
> await Promise.allof(@proms);
> 
> say $*VM;
> ###
> 
> 
> this does not crash for me
> ### supply_to_many.raku ###
> my Channel $ch .= new;
> 
> my $p1 = Supply.interval(3);
> 
> my @proms = (1..2000).map: {
>      start react {
> whenever $p1 { $ch.close }
>     whenever $ch.closed { done }
> }
> };
> 
> 
> await Promise.allof(@proms);
> 
> say $*VM;
> ###
> 
> 
> This gives a sensible error "Cannot send a message on a closed channel"
> ### close_then_send.raku ###
> my Channel $ch .= new;
> 
> # Close first, send next
> $ch.close;
> $ch.send("Hi!");
> ###
> 
> 
> This does not crash for me, for different combinations of $senders & 
> $receivers (1000,1) (1,1000) (1000,1000)
> ### config_send_recv.raku ###
> my Channel $ch .= new;
> 
> my Supply $p1 .= interval(1);
> 
> my ($senders, $receivers) = (2000,2);
> 
> 
> my Int $count = 0;
> my @sends = (1..$senders).map: {
>    start react {
>    whenever $p1 -> $interval {
>       $ch.send($_);
>       $ch.close if ++$count == $senders;
>    }
> 
>     whenever $ch.closed { done }
> 
>    }
> };
> 
> 
> my @proms = (1..$receivers).map: {
>    start react {
>       whenever $ch.closed {
>           done;
>       }
> 
>       whenever $ch -> $data {
>           print "$_=$data|";
>       }
>    }
> };
> 
> 
> await Promise.allof(@proms,@sends);
> 
> say $*VM;
> ###
> 
> I didn't succeed - fun to try!
> 
> -y
> 
> 
> On Tue, Apr 5, 2022 at 3:55 PM William Michels via perl6-users 
> <perl6-users@perl.org <mailto:perl6-users@perl.org>> wrote:
> 
>     Thanks for the bash loop. I'm seeing a few hangs, also some errors
>     returned saying:
> 
>     "Unhandled exception in code scheduled on thread 4"
> 
>     (MacOS 11.11)
> 
>     On Tue, Apr 5, 2022 at 12:47 PM David Emanuel da Costa Santiago
>     <demanuel@gmail.com <mailto:demanuel@gmail.com>> wrote:
> 
> 
>         Hi William,
> 
>         when it fails or hangs it doesn't print the last line.
> 
>         Please check attached file for output of the stack.
> 
>         Since the failures are random, it's easier to invoke it in a loop:
> 
>         bash$ for i in $(seq 100); do raku test.raku; done
> 
>         If nothing is wrong with the code, i'll open a bug in the github.
> 
>         Regards,
>         David Santiago
> 
> 
>         Às 21:37 de 05/04/22, William Michels escreveu:
>          > No problems so far.
>          >
>          > say $*VM; #add as last line, returns:
>          > moar (2021.06)
>          >
>          > On Tue, Apr 5, 2022 at 11:06 AM David Emanuel da Costa Santiago
>          > <demanuel@gmail.com <mailto:demanuel@gmail.com>
>         <mailto:demanuel@gmail.com <mailto:demanuel@gmail.com>>> wrote:
>          >
>          >     Hi,
>          >
>          >
>          >
>          >     I'm trying to learn about promises, supplies and
>         channels. So i made
>          >     this code:
>          >
>          >     """
>          >
>          >     my $p1 = Supply.interval(5);
>          >     my $p2 = Supply.interval(2);
>          >     my Channel $ch = Channel.new;
>          >
>          >     my $prom = start react {
>          >           whenever $p1 -> $interval {
>          >               say "5";
>          >           }
>          >
>          >           whenever $p2 -> $interval {
>          >               say 2;
>          >           }
>          >
>          >           whenever $ch.closed {
>          >               done;
>          >           }
>          >
>          >           whenever $ch -> $data {
>          >               say "Data: $data";
>          >           }
>          >     }
>          >
>          >     my $prom2 = start react {
>          >           whenever $p1 -> $interval {
>          >               $ch.send("5.2");
>          >               $ch.close;
>          >           }
>          >           whenever $ch.closed {
>          >               done;
>          >           }
>          >     }
>          >
>          >     my @proms = ($prom, $prom2);
>          >     await Promise.allof(@proms);
>          >
>          >     """
>          >
>          >
>          >
>          >     I don't see anything wrong with this but most of the
>         times runs fine,
>          >     sometimes hangs, sometimes throw exception. Am i doing
>         something that i
>          >     shouldn't be doing?
>          >
>          >     $ raku --version
>          >     Welcome to Rakudo™ v2022.03-130-g8f7cc0847.
>          >     Implementing the Raku® Programming Language v6.d.
>          >     Built on MoarVM version 2022.03-13-ga3476e286.
>          >
>          >
>          >
>          >     Regards,
>          >     David Santiago
>          > 
> 

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About