Perl - Win32 - Come eseguire una lettura non bloccante di un filehandle da un altro processo?
-
02-07-2019 - |
Domanda
Sto scrivendo del codice server che comunica con un processo client tramite STDIN. Sto provando a scrivere un frammento di codice perl che riceve in modo asincrono le risposte dallo STDOUT del client. La versione bloccante del codice potrebbe apparire così:
sub _read_from_client
{
my ($file_handle) = @_;
while (my $line = <$file_handle>) {
print STDOUT $line;
}
return;
}
È importante sottolineare che lo snippet deve funzionare nella piattaforma Win32. Esistono molte soluzioni per le piattaforme * nix che non mi interessano. Sto utilizzando ActivePerl 5.10.
Soluzione
Questa discussione su Perlmonks suggerisce che puoi creare un socket senza blocco su Windows in Perl in questo modo:
ioctl($socket, 0x8004667e, 1);
Maggiori dettagli e risorse in quel thread
Altri suggerimenti
Se non vuoi seguire la strada di basso livello, dovrai guardare le altre soluzioni più strutturate.
Puoi usare un thread per leggere dall'input e fare in modo che riempia tutti i dati legge in un Thread :: Queue che poi gestisci nel tuo thread principale.
Puoi guardare POE che implementa un framework basato su eventi, in particolare POE :: Wheel :: Run :: Win32 . Potenzialmente, puoi anche rubare il codice da esso per implementare le letture di non blocco.
Puoi guardare [Coro], che implementa un sistema multitasking cooperativo usando coroutine. Questo è per lo più simile ai thread, tranne per il fatto che si ottengono thread spazio utente, non thread di sistema.
Non hai dichiarato fino a che punto vuoi andare, ma la tua scelta è tra sysread
e un framework, o scrivendo tu stesso tale framework. Il percorso più semplice da percorrere è solo usare i thread o scorrere il codice di Poe :: Wheel :: Run :: Win32
.