前言
在本文中,我們介紹用於共時性程式的低階 API,雖然 Raku 官網不鼓勵我們使用低階 API,仍然保留較為傳統的 Thread
和 Lock
等物件,必要時仍然可以使用。
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
保護這些結構。