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

PUBLISHED ON JAN 24, 2018 — PROGRAMMING

在本文中,我們介紹用於共時性程式的低階 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 保護這些結構。

comments powered by Disqus