Perl-Win32-如何从另一个进程非阻塞读取文件句柄?
时间:2020-03-06 14:48:04 来源:igfitidea点击:
我正在编写一些服务器代码,这些代码通过STDIN与客户端进程进行对话。我正在尝试编写一段perl代码,以异步方式接收来自客户端STDOUT的响应。代码的阻塞版本可能如下所示:
sub _read_from_client { my ($file_handle) = @_; while (my $line = <$file_handle>) { print STDOUT $line; } return; }
重要的是,该代码段需要在Win32平台上工作。我对* nix平台有很多不感兴趣的解决方案。我使用的是ActivePerl 5.10.
解决方案
Perlmonks上的该线程建议我们可以通过以下方式在Windows上的Perl中使套接字无阻塞:
ioctl($socket, 0x8004667e, 1);
该线程中的更多详细信息和资源
如果我们不想走低级路线,那么我们将不得不考虑其他更具框架化的解决方案。
我们可以使用线程从输入中读取内容,并将读取的所有数据填充到Thread :: Queue中,然后在主线程中进行处理。
我们可以查看实现了基于事件的框架的POE,尤其是POE :: Wheel :: Run :: Win32. 潜在地,我们还可以从中窃取代码以自己实现无阻塞读取。
我们可以查看[Coro],它使用协同程序实现了协作式多任务处理系统。除了获得用户空间线程而不是系统线程外,这与线程最相似。
我们尚未说明要走多远,但是我们可以在sysread
和框架之间进行选择,或者自行编写所述框架。最简单的方法就是使用线程或者通过Poe :: Wheel :: Run :: Win32
的代码进行操作。