【发布时间】:2018-11-07 11:21:36
【问题描述】:
该程序创建一个线程来使用 dir() 读取目录并将文件放在通道上。 $N 个工作线程读取该通道并“处理”(打印)文件。
但是我得到了这个“首先等待的操作:”错误。
我已多次阅读有关此错误的陷阱页面,但仍然无法理解。有人能解释一下这里发生了什么吗?
目录内容:
$ ls a b c traverse-dir0.p6运行程序:
$ ./traverse-dir0.p6 遍历-dir0.p6 一种 b C 首先等待一个操作: 在 ./traverse-dir0.p6 第 24 行的子 MAIN 中 在 ./traverse-dir0.p6 第 5 行的块中 死于异常: 找不到方法“路径”:没有方法缓存,也没有 .^find_method 在 ./traverse-dir0.p6 第 16 行的块中程序遍历-dir0.p6:
#!/usr/bin/env perl6 # 有一个线程通过使用 dir() 读取目录中的文件名来填充 $dir-channel # 和 $N 工作线程从 $dir 通道读取文件名。 子主(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; }【问题讨论】:
-
基础错误是
Cannot find method 'path': no method cache and no .^find_method。修复该错误,看看会发生什么 -
你为什么这么关注“An operation first awaited”(这只是一个句子片段,完整的句子是“An operation(that was first waiting in [location])死了,但例外: “)?错误是
Cannot find method 'path'。 -
事后看来,我本可以更好地分阶段提出这个问题。但是我更感兴趣的是流控制如何到达“找不到方法'路径'”,即
say $file.path;
行。为什么 .resume 在while my $file = $dir-channel.receive()
循环
标签: asynchronous channel raku