如何在Perl中等待异步文件

3
我在尝试测试一个异步写入文件的日志模块...单元测试试图读取日志来确保写入的消息与预期匹配。然而,我发现即使我睡眠等待文件一段任意长度的时间,该模块的异步写入也直到单元测试完成后才到达文件。通过在aio_close旁边添加打印语句,我验证了文件直到最后才关闭。我该怎么做来测试这个问题?
        #approximately the way this works:
        aio_open($pathname,
             $flags,
             $mode,
             sub
             {
                 my $fh = shift;
                 aio_write($fh,
                             0,
                             length($log),
                             $log,
                             0,
                             sub
                             {
                                 print "here";
                                 aio_close($fh, sub {});
                             });
             });
2个回答

2

好的,我稍微查了一下,发现我可以调用...

IO::AIO::flush;

这会导致在我的测试执行之前,所有异步缓冲区都被刷新。

并不完全是这样。flush会导致程序等待所有挂起的异步操作完成。在你的情况下,这包括执行aio_close,最终清空输出缓冲区。 - mob

1

让您的文件写入器接受一个名为"done_writing"的回调子程序。

如果提供了,就调用它。

让单元测试提供一个回调函数,该函数可以创建一个触摸文件,或者只是在单元测试中填充一个"ready"标志。

作为备选版本,让回调发出一个信号,并设置单元测试休眠并带有该信号的信号处理程序。


我认为如果我将其自动刷新,它会阻塞(因此不再是异步的),对吗?我考虑修改回调函数的记录器...我认为那样会起作用。最终我找到了我添加的答案。 - tbischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接