我的 Linux 盒子正在从 mp4 转码 到 av1 像一个老板。我想,缩小空间的霸主减半是便宜,然后一倍的磁盘空间。用20.29的负载运行了几天,帮助发现了一个 bug 和一个 ENODOCish。
我想用下面的代码来 DWIM。
my $obj = class AnonClass {
has @.a;
method push(\e) { self.a.push: e; self }
method list { self.a.list }
}.new;
my $sort = Proc::Async.new('/usr/bin/sort');
{ (‚a‘..‚z‘).roll(10) } |> $sort |> $obj;
有一个块,返回一个列表(就是那个小的可能会偷懒的列表),然后把它的值送入 sort
。有一个块状的 shell 命令,对懒惰的列表没有太大帮助,但块状确实有助于发现我之前的一个思路。然后将结果送入我称之为 Arrayish 的东西,一个由子集定义的 not-quite-type
。
subset Arrayish of Any where { .^can(‚push‘) && .^can(‚list‘) }
用在签名中,它的基本意思是:“如果你给我一个有 .push
和 .list
的对象 并具有内置类型的语义,我很乐意接受”。处理这种情况的管道操作符看起来如下。
my multi infix:«|>»(Arrayish:D \a, Proc::Async:D $in) {
my $pipe = Shell::Pipe.new;
$pipe.pipees.push: a;
$pipe.pipees.push: $in;
# FIXME workaround R#3778
$in.^attributes.grep(*.name eq '$!w')[0].set_value($in, True);
$pipe.starters.push: -> {
| $in.start, start {
LEAVE try $in.close-stdin;
await $in.ready;
$in.write: „$_\n“.encode for a.list;
}
}
$pipe
}
一开始我没有 blocking await $in.ready
, 这是导致块在正确启动并准备在在其 STDIN 上读取之前按排序方向吐出文本的原因。文档中提到了 .write
和 .ready
,但是并没有说明需要一起使用。如果我的系统会闲置,我可能不会发现。所以我可以得出结论,色情片是有用的,只要把它做得更小就可以了。一个令人惊讶的想法,因为它通常是用来把东西变大的。
如果你使用异步行为,在后台运行 stress -c 32
可能会有帮助,把你的 heisenbugs 推到边缘。当你在做的时候,请把我的 bug 也推到边缘。我真的不希望有他们。
by glfdex.