Perl 6 程式設計教學:共時性 (Concurrency) (低階 API)

PUBLISHED ON JAN 24, 2018 — PROGRAMMING
FacebookTwitter LinkedIn LINE Skype EverNote GMail Email Email

    在本文中,我們介紹用於共時性程式的低階 API,雖然 Perl 6 官網不鼓勵我們使用低階 API,仍然保留較為傳統的 ThreadLock 等物件,必要時仍然可以使用。

    Thread

    Thread 是基本的共時性程式區塊。以下程式建立一個 Thread 並於稍後執行:

    my $t = Thread.new(
        name => "Hello Thread", 
        code => { say "Hello from thread"; }
    );
    
    $t.name eq "Hello Thread" or die "Wrong name";
    
    $t.run;
    $t.finish;
    

    也可以用 start 方法立即執行 Thread 物件:

    my $t = Thread.start({ say "Hello from thread"; });
    
    $t.finish;
    

    但除此之外,Thread 沒有額外提供同步化,故不鼓勵使用。

    Scheduler

    Scheduler 是一個定期執行的物件,如下:

    my $i = 0;
    my $cancellation = $*SCHEDULER.cue({ say $i++}, every => 2 );
    
    sleep 10;
    $cancellation.cancel;
    sleep 10;
    

    有些函式庫會提供自己的 Scheduler 物件,也可以使用內建的 Scheduler 物件,像是 ThreadPoolScheduler 等。

    Lock

    註:Lock 對應於其他程式中的 mutex。

    Lock 物件會將特定程式區塊鎖住,避免多個 Thread 同時存取,如下例:

    my $lock = Lock.new;
     
    my $a = 0;
     
    await (^10).map: {
        start {
            $lock.protect({
                my $r = rand;
                sleep $r;
                $a++;
            });
        }
    }
     
    say $a;
    

    由於內建的陣列和雜湊並沒有針對共時性去設計,必要時可以使用 Lock 保護這些結構。