如何在perl线程中中断I/O调用



看起来旧的好警报()调用的时代已经结束了,那么如何中断从perl线程(使用全新的"线程"模块)生成的阻塞读取()和写入(),假设生成这些阻塞调用的代码无法更改?实际问题是与Modbus设备的通信受阻,所以我创建了一个简单的测试用例,不会让你陷入RS-485地狱:

use threads;
use IO::Handle;
threads->create(sub {
        $io = IO::Handle->new_from_fd(fileno(STDIN), 'r') or die;
        $br = read $io, $buf, 100;
        warn "read: $br";
});
while(1) {threads->yield()};

在这里,warn()永远不会执行,除非您在键盘上点击Ctrl-D。有什么简单的解决方案可以使read()调用超时吗?

与其使用线程(这在Perl中充其量是不受支持的,而且大多不受欢迎),为什么不尝试其中一个事件模块呢?这是Perl中并发性的标准解决方案。

最新更新