Acme-Parataxis

 view release on metacpan or  search on metacpan

t/006_parallel.t  view on Meta::CPAN

use v5.40;
use Test2::V1 -ipP;
use blib;
use Acme::Parataxis;
use Time::HiRes qw[time];
$|++;
Acme::Parataxis::run(
    sub {
        my $start_time = time();
        diag "Starting parallel sleeps at $start_time...";

        # Check thread pool size
        my $pool_size = Acme::Parataxis::get_thread_pool_size();
        diag "Detected thread pool size: $pool_size";

        # Spawn only as many tasks as we have threads (up to 3) to ensure they run in parallel.
        # If pool size is 2, running 3 tasks takes 2 seconds, failing the 1.8s test.
        my $num_tasks = $pool_size;
        $num_tasks = 3 if $num_tasks > 3;
        $num_tasks = 1 if $num_tasks < 1;
        diag "Spawning $num_tasks parallel tasks...";
        my @futures;
        for my $i ( 1 .. $num_tasks ) {
            push @futures, Acme::Parataxis->spawn(
                sub {
                    my $id = $i;    # Closure capture
                    diag "Fiber $id started (FID: " . Acme::Parataxis->current_fid . ')';
                    diag "Fiber $id: Sleeping for 1000ms...";
                    Acme::Parataxis->await_sleep(1000);
                    diag "Fiber $id: Woke up!";
                    return $id;
                }
            );
        }

        # Wait for all
        diag "Main: Waiting for $num_tasks fibers to finish...";
        my @results;
        push @results, $_->await() for @futures;
        my $elapsed = time() - $start_time;
        diag "Total wallclock time: $elapsed seconds";
        diag 'Results: ' . join( ', ', @results );
        my $expected = [ 1 .. $num_tasks ];
        is \@results, $expected, 'Fibers returned correct individual results';

        # If we have at least 1 task, it should take ~1s.
        ok $elapsed < 1.8, "$num_tasks tasks ran in parallel (elapsed < 1.8s)";
    }
);
done_testing();



( run in 1.869 second using v1.01-cache-2.11-cpan-39bf76dae61 )