Spinning Up Sort

Spinning Up Sort

我的 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.

comments powered by Disqus