您如何在 Raku 中进行文件锁定?

How Do You Do File Locking in Raku?

我一直在尝试弄清楚如何在 Raku 中进行文件锁定,但没有成功。我开始使用 NativeCall 研究 fcntl,但后来意识到 fcntl 锁不会阻止其他线程访问文件。在 Raku 中进行文件锁定的最佳方法是什么?

IO::Handle 有一个 lock and an unlock 方法到 lock/unlock 文件。锁可以是独占的或共享的。

我遇到过这些 Raku 惯用语并经常使用它们,'given' 成为 brevity/clarity 的话题:

阅读:

    given $path.IO.open {
        .lock: :shared;
        %data = from-json(.slurp);
        .close;
    }

写入:

    given $path.IO.open(:w) {
        .lock;
        .spurt: to-json(%data);
        .close;
    }