8
votes

Est-ce que Parallel :: ForkManager () Sélectionnez la synchronisation sur les variables globales?

Je suis très nouveau à ce Parallel :: ForkManager module à Perl Et il a beaucoup de crédits, alors je pense qu'il soutient ce dont j'ai besoin et que je ne les ai pas encore compris.

Ce que je dois faire est dans chaque processus enfant, il écrit des mises à jour dans une carte de hachage globale, en fonction de la valeur clé calculée dans chaque processus d'enfant. Cependant, lorsque je procède pour réclamer une carte de hachage en dehors de la boucle pour la boucle et que la carte de hachage est mise à jour après la boucle, il s'avère que la carte de hachage reste vide. Cela signifie que bien que la mise à jour à l'intérieur de la boucle réussisse (en imprimant la valeur), en dehors de la boucle, ce n'est pas le cas.

Quelqu'un sait-il comment écrire un tel code qui fait ce que je veux?


0 commentaires

3 Réponses :


4
votes

Chaque Fork L'appel génère un tout nouveau processus, les mises à jour de la variable de hachage dans un processus enfant ne sont pas visibles dans le parent (et des modifications apportées au parent après le Fourche Les appels ne sont pas visibles chez l'enfant).

Vous pouvez utiliser threads (et voir aussi threads :: partagé ) pour avoir un changement écrit dans un Le fil soit écrit dans un autre fil.

Une autre option consiste à utiliser la communication interprocessée pour passer des messages entre les processus parents et enfants. Fourches :: Super module (dont je suis l'auteur) peut faire cela moins de mal de tête.

ou vos processus enfants pourraient écrire une sortie sur des fichiers. Lorsque le processus parent les récolte, il pourrait charger les données de ces fichiers et mettre à jour sa carte de hachage globale en conséquence.


3 commentaires

Merci tout le monde, maintenant je comprends! Je m'attendais à la Forkmanager () de prendre soin de cette question. :-) Dans mon cas, la CIB pourrait être surchargée. J'aime la méthode concise d'utiliser ForkManager (), alors existe-t-il un moyen facile de partager une carte de hash globale entre les processus utilisant ForkManager ()?


@Jin: Obtenir des données d'un processus à un autre est IPC. C'est ce que cela signifie. Cela n'a pas besoin d'être difficile, cependant.


@Jin: Oui, utilisez un hachage lié; Voir Search.cpan.org/perldoc/berkeleydb pour un.



6
votes

Ce n'est pas vraiment un problème spécifique à Perl, mais une question de compréhension des processus de style UNIX. Lorsque vous Fourchette Un nouveau processus, aucune de la mémoire n'est partagée par défaut entre les processus. Il y a quelques façons de réaliser ce que vous voulez, en fonction de ce dont vous avez besoin.

Un moyen facile serait d'utiliser quelque chose comme Berkeleydb pour attacher un hash à un fichier à un fichier sur disque. Le hachage attaché peut être initialisé avant votre fourchette, puis chaque processus enfant aurait accès à celui-ci. Les fichiers BerkeleyDB sont conçus pour être sécuritaires à partir de plusieurs processus simultanément.

Une méthode plus impliquée serait d'utiliser une forme de communication inter-processus. Pour tous les détails de Gory de la réalisation de tels, voir le Perlipc Manpage, qui a des détails sur plusieurs IPC Méthodes supportées par Perl.

Une approche finale, si votre Perl le supporte, est d'utiliser des threads et de partager des variables entre eux.


0 commentaires

2
votes

Lire la section "Récupération de données de données des processus enfants" de l'homme parallèle :: forkmanager. Il y a des rappels, les données de l'enfant peuvent être envoyées et parent peuvent les récupérer et remplir des structures de données.


0 commentaires