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的代码进行操作。