gpt4 book ai didi

raku - 如何使用 :since with CompUnit

转载 作者:行者123 更新时间:2023-12-04 08:31:26 29 4
gpt4 key购买 nike

我正在尝试通过使用 CompUnit 类集预编译它们来创建 POD6 的缓存。

我可以按如下方式创建、存储和检索 pod:

use v6.c;
use nqp;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');
'test.pod6'.IO.spurt(q:to/CONTENT/);
=begin pod
=TITLE More and more

Some more text

=end pod

CONTENT
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load($key, )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected ~~ Pod::Block::Named;

所以现在我换了 POD,如何使用 :since旗帜?我以为如果 :since包含编译后的时间,则句柄的值为 Nil。情况似乎并非如此。
my $new-handle = $precomp.load($key, :since('test.pod6'.IO.modified));
say 'I got a new handle' with $new-handle;

输出是“我有一个新句柄”。

我做错了什么?
这是一个带有代码和输出的 pastebin 链接: https://pastebin.com/wtA9a0nP

最佳答案

模块加载代码缓存查找并基本上从以下内容开始:

$lock.protect: { 
return %loaded{$id} if %loaded{$id}:exists;
}

所以问题变成了“我如何加载一个模块然后卸载它(所以我可以再次加载它)?”答案是:您无法卸载模块。但是,您可以更改文件名、分发长名称(通过更改名称、身份验证、api 或版本)或 precomp id——无论特定的 CompUnit::Repository 使用什么来唯一标识模块——以绕过缓存。

似乎被忽视的是 $key旨在表示一个不可变的名称,以便它始终指向相同的内容。什么版本的 foo.pm应该为模块 Used::Inside::A 加载如果 foo.pm正在被模块 A 加载和 B同时,模块 A先加载 foo,然后再加载 Module B修改 foo?旧版模组 A加载,还是(可能与以前的版本冲突)模块 B 加载的版本?这种差异化对于预编译文件生成本身将如何起作用(这又可以并行发生)?

当然,如果我们忽略上面的内容,我们可以添加代码来提高 .IO.modified要求所有 CompUnit::Repository 类型的每个模块加载(减慢启动速度)说“嘿,这个不可变的东西改变了”。但是某些操作系统上文件系统修改时间戳的粒度使得检查非常脆弱(特别是对于生成预编译文件的多线程模块加载),这意味着每次都需要更昂贵的调用来获取校验和。

关于raku - 如何使用 :since with CompUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53005084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com