Existe-t-il un moyen d'avoir des processus gérés dans Perl (c'est-à-dire un remplacement de threads qui fonctionne réellement)?

StackOverflow https://stackoverflow.com/questions/138696

Question

J'ai une application multithreded en perl pour laquelle je dois m'appuyer sur plusieurs modules non sécurisés pour les threads. J'utilise donc les processus fork () avec kill () signale comme une interface de passage de messages.

Le problème est que les gestionnaires de signaux sont un peu erratiques (pour le moins qu'on puisse dire) et se retrouvent souvent avec des processus qui sont tués dans des états inappropriés.

Y a-t-il une meilleure façon de faire cela?

Était-ce utile?

La solution

Consultez forks.pm , un "remplacement immédiat pour les threads Perl à l'aide de fork ()" ce qui rend l'utilisation de la mémoire beaucoup plus sensible (mais ne l'utilisez pas sur Win32). Cela vous permettra de déclarer " partagé " variables, puis il transmet automatiquement les modifications apportées à ces variables entre les processus (similaire à la façon dont threads.pm agit).

Autres conseils

En fonction de ce que votre programme doit faire, vous pouvez envisager d’utiliser POE , qui est un framework Perl pour les applications multithreads avec des threads d'espace utilisateur. C’est complexe, mais élégant et puissant, qui peut vous aider à éviter les modules ne tenant pas compte des threads en limitant l’activité à un seul thread interpréteur Perl.

Ressources utiles pour commencer:

De plus, il existe des centaines de composants POE prédéfinis . vous pouvez utiliser pour assembler dans une application.

Vous pouvez toujours avoir un canal entre le parent et l'enfant pour faire passer les messages dans les deux sens.

pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
    close $reader;
    ...
}
else {
    close $writer;
    my $msg_from_child = <$reader>;
    ....
}

Ce n'est pas une manière très confortable de programmer, mais cela ne devrait pas être "erratique".

À partir de Perl 5.8, vous devriez vous pencher sur le module des threads principaux. Consultez http://metacpan.org/pod/threads

.

Si vous souhaitez utiliser des modules qui ne sont pas thread-safe, vous pouvez généralement les charger avec un require et importer à l'intérieur du point d'entrée du thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top