gpt4 book ai didi

asynchronous - perl6 "An operation first awaited"

转载 作者:行者123 更新时间:2023-12-04 14:22:48 24 4
gpt4 key购买 nike

该程序创建一个线程来使用 dir() 读取目录并将文件放在 channel 上。 $N 工作线程读取该 channel 并“处理”(打印)文件。

但是,我收到此“首先等待操作:”错误。

我已多次阅读有关此错误的陷阱页面,但仍然无法理解。有人能解释一下这里发生了什么吗?

目录内容:

$ls
a b c traverse-dir0.p6

运行程序:

$ ./traverse-dir0.p6
遍历-dir0.p6
一种

C
首先等待一个操作:
在 ./traverse-dir0.p6 第 24 行的 sub MAIN
在 ./traverse-dir0.p6 第 5 行的块中

死于以下异常:
找不到方法“路径”:没有方法缓存,也没有 .^find_method
在 ./traverse-dir0.p6 第 16 行的块中

程序traverse-dir0.p6:

#!/usr/bin/env perl6
# 有一个线程通过使用 dir() 读取目录中的文件名来填充 $dir-channel
# 和 $N 工作线程从 $dir-channel 读取文件名。

sub MAIN( Str $dir = ".", Int :$N = 4 ) {

我的 $dir-channel = Channel.new();
我的 $dir-read = 开始 {
$dir-channel.send( $_ ) for dir $dir;
$dir-channel.close;
}

我的@workers = (^$N).map: {
开始 {
而我的 $file = $dir-channel.receive() {
说 $file.path;
}
捕获 {
当 X::Channel::ReceiveOnClosed { .resume }
}
}
}

等待 $dir-read,@workers;
}

最佳答案

首先,关于 await 抛出的异常的输出.当异步操作失败时,有两条有趣的信息:

  • 在程序中我们想要操作的结果
  • 程序中哪里出现了无法执行操作的问题

  • 第一条信息表明 await的位置,堆栈跟踪与此相关。第二部分是关于为什么 await重新抛出异常的原因,并表示需要修复的问题。

    这种情况下的问题是 path方法在没有对象的对象上调用。这要归功于 .resume ,这没有任何意义。抛出异常表示无法从 channel 接收值。恢复它只是意味着循环体在 $file 中以未定义的值运行。 ,缺少 path方法并导致错误。 (顺便说一句: .resume 是正确答案的情况非常非常罕见。)

    对代码的最小修复是替换 .resumelast ,当 channel 关闭时终止迭代:
    my @workers = (^$N).map: {
    start {
    while my $file = $dir-channel.receive() {
    say $file.path;
    CATCH {
    when X::Channel::ReceiveOnClosed { last }
    }
    }
    }
    }

    但是,强制执行 Channel 要简单得多。变成一个可迭代的 Seq .当 Channel 出现时,这会自动处理终止迭代。已关闭,因此不会出现异常:
    my @workers = (^$N).map: {
    start {
    for $dir-channel.Seq -> $file {
    say $file.path;
    }
    }
    }

    start是一个语句前缀,进一步缩短为:
    my @workers = (^$N).map: {
    start for $dir-channel.Seq -> $file {
    say $file.path;
    }
    }

    我很欣赏这可能是一个更有趣的问题的简化版本,或者可能是为了探索各种 Perl 6 并发概念,但可以用以下内容替换:
    sub MAIN( Str $dir = ".", Int :$N = 4 ) {
    race for dir($dir).race(batch => 1, degree => $N) -> $file {
    say $file.path;
    }
    }

    它具有相同的语义,但节省了启动和管理 worker,同时仍然控制 worker 的数量并确保文件以相同的方式在 worker 之间分布。

    关于asynchronous - perl6 "An operation first awaited",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573586/

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