小编Her*_*rad的帖子

在Mojolicious中使用AnyEvent run_cmd,我不断收到此错误:"AnyEvent :: CondVar:递归阻塞等待尝试"

在一个Mojolicious应用程序中,我正在尝试在单击链接时将ODT文件转换为HTML.我使用shell命令"soffice"转换文件.转换文件需要一些时间.我向用户发送状态消息以通知他进度.我通过写入Mojo :: Log对象发送这些状态更新消息.然后,我在EventSource路由中订阅此日志对象.

然后我遍历文件并使用AnyEvent :: Util run_cmd来执行外部"soffice"程序.

for my $file (@{ $filelist }) {
   my $output_dir = './output_dir';
   my $cmd = "soffice --headless --convert-to html --outdir '$output_dir' '$file'";
   my $cv = AnyEvent->condvar;
   my $w;
   $w = run_cmd($cmd, 
                '>'  => sub { my $out = shift;
                              &WriteToLog({ status => "cmd output '$out'..." });
                              undef $w;
                              $cv->send;
                 },

                '2>' => sub { my $err = shift;
                              &WriteToLog({ status => "ERROR '$err'..." });
                              undef $w;
                              $cv->send;
                 }
            );

   $cv->recv;
}
Run Code Online (Sandbox Code Playgroud)

几乎从主要的AnyEvent教程中复制和粘贴.如果只有很少的文件要转换(大约2或3),那么一切顺利.通过EventSource连接发送的状态消息显示在客户端浏览器上.然后在转换完所有文件后,将呈现网页.

如果要处理更多文件,则会转换一些文件,然后会出现线程标题中的错误消息.

包含上述代码的路由的路由是: …

perl asynchronous mojolicious anyevent

5
推荐指数
1
解决办法
1912
查看次数

标签 统计

anyevent ×1

asynchronous ×1

mojolicious ×1

perl ×1