位元詩人 [Raku] 程式設計教學:共時性 (Concurrency) (低階 API)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在本文中,我們介紹用於共時性程式的低階 API,雖然 Raku 官網不鼓勵我們使用低階 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 保護這些結構。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。