Perl - Win32 - Comment faire une lecture non bloquante d'un descripteur de fichier depuis un autre processus?
-
02-07-2019 - |
Question
J'écris un code de serveur qui communique avec un processus client via STDIN. J'essaie d'écrire un extrait de code Perl qui reçoit de manière asynchrone les réponses du client STDOUT. La version bloquante du code pourrait ressembler à ceci:
sub _read_from_client
{
my ($file_handle) = @_;
while (my $line = <$file_handle>) {
print STDOUT $line;
}
return;
}
Il est important de noter que l'extrait de code doit fonctionner sur la plate-forme Win32. De nombreuses solutions pour les plates-formes * nix ne m'intéressent pas. J'utilise ActivePerl 5.10.
Autres conseils
Si vous ne souhaitez pas emprunter la voie de bas niveau, vous devrez examiner les autres solutions plus structurées.
Vous pouvez utiliser un fil pour lire à partir de l'entrée et le laisser en extraire toutes les données lit dans un Thread :: Queue que vous gérez ensuite dans votre thread principal.
Vous pouvez consulter POE qui implémente un cadre basé sur des événements, en particulier POE :: Wheel :: Run :: Win32 . Potentiellement, vous pouvez également voler le code pour implémenter vous-même les lectures non bloquantes.
Vous pouvez consulter [Coro], qui implémente un système multitâche coopératif utilisant des routines. Ceci est généralement similaire aux threads, sauf que vous obtenez des threads en espace utilisateur, pas des threads système.
Vous n'avez pas précisé jusqu'où vous voulez aller, mais vous avez le choix entre sysread
et un framework, ou l'écriture de ce framework vous-même. Le plus simple est d’utiliser des threads ou en passant par le code de Poe :: Wheel :: Run :: Win32
.