Lorsque plusieurs processus sont sortis dans un seul fichier, risque de rencontrer des problèmes potentiels, comme des messages écrasés ou entremêlés. J'ai eu ceci se produire avec des programmes dans d'autres langages (comme C), et supposons le même problème pourrait survenir dans MATLAB, mais j'avoue librement que je pourrais me tromper à ce sujet. En supposant que je suis pas mal ...
Si vous souhaitez fiable des données de sortie de plusieurs processus de travail à un seul fichier journal tandis que les processus sont en cours d'exécution, une façon de le faire est de faire un processus est responsable de toutes les opérations sur les fichiers (c'est-à-dire un processus "maître"). Le processus "maître" collectera des messages provenant des autres travailleurs (c'est-à-dire "esclaves") et produira ces données dans le fichier journal.
Étant donné que je ne sais pas exactement ce que fait chaque processus, il est difficile de suggérer des modifications de code spécifiques à faire. Voici quelques étapes et un exemple de code pour savoir comment procéder dans MATLAB. Ces exemples de code suppose que vous utilisez la même fonction (process_fcn) sur chaque processus:
Le processus « maître » doit d'abord ouvrir le fichier. Ce code (en utilisant la fonction labindex) doit être exécuté au début de process_fcn:
if (labindex == 1),
fid = fopen('log.txt','at'); %# Open text file for appending
end
Bien que chaque processus est en cours d'exécution, vous pouvez collecter des données qui doit être sortie du fichier journal dans une variable appelé données, qui stocke une chaîne ou un tableau de caractères. Ces données peuvent être des messages d'erreur capturés dans un try-catch block ou toute autre donnée que vous souhaitez voir figurer dans le fichier journal.
Aux points périodiques process_fcn (soit lorsque les tâches principales sont terminées ou dans une boucle de calcul), vous devez avoir chaque chèque de processus pour les données qui doit être sortie (c.-à-données est pas vide) et que ces données soient envoyées au processus "maître".Le processus «maître» rassemblerait et imprimerait ensuite ces messages à partir d'autres processus, ainsi que des siens. Voici un exemple de la façon dont cela pourrait être fait (en utilisant les fonctions labBarrier, labProbe, labSend et labReceive):
labBarrier; %# All processes are synchronized here
if (labindex == 1), %# This is done by the "master"
if ~isempty(data),
fprintf(fid,'%s\n',data); %# Print "master" data
end
pause(1); %# Wait a moment for "slaves" to send messages
while labProbe, %# Loop while messages are available
data = labReceive; %# Get data from "slaves"
fprintf(fid,'%s\n',data);
end
else %# This is done by the "slaves"
if ~isempty(data),
labSend(data,1); %# Send data to the "master"
end
end
data = ''; %# Clear data
L'appel à PAUSE est là pour faire en sorte que les appels à labSend pour chaque « esclave » processus se produit avant que le "maître" commence à chercher des messages envoyés.
Enfin, le processus "maître" doit fermer le fichier. Ce code doit être exécuté à la fin de process_fcn:
if (labindex == 1),
fclose(fid);
end
Êtes-vous en train de faire honteusement parallèle? Voulez-vous un fichier pour chaque travailleur, ou un seul sur l'ordinateur client. À quelle fréquence voulez-vous que ce fichier soit mis à jour, un par tâche? – MatlabDoug