8
votes

Rejoindre la sortie Python simultanée

J'utilise quelque chose comme ceci: xxx

intérieur logger.py Je traite les fichiers sortant des lignes reformatées. Alors collab devrait ressembler à xxx

au lieu de cela, les lignes sont parfois jumblées: xxx

Comment puis-je empêcher / corriger ceci ?


5 commentaires

Votre logger.py est-il multithreau ou quelque chose?


@aioobe: xargs -n1 -p10 exécute dix processus concurrents (de logger.py ). Voir Xargs .


Oh, à droite, mal interpréter la page man et mélangé avec -p . C'est une bonne question!


Comment la sortie est-elle effectuée dans le logger.py ?


@Josh, avez-vous essayé d'ajouter flush après écrit ou en utilisant des objets de fichier non coupés? (BTW, c'est ce que Glenn suggère ci-dessous)


3 Réponses :


1
votes

La solution compliquée et techniquement correcte serait de mettre en œuvre un mutex pour écrire, mais c'est sous-optimal, je pense.

Et ce n'est pas amusant de toute façon. Que diriez-vous de la sortie de la sortie de Xargs (de cette façon, vous obtenez des morceaux de sortie solides, au lieu d'un flux de sortie qui se fait briser), puis combinez ces morceaux d'une manière ou d'une autre?


0 commentaires

2
votes

En général, il y a des problèmes qui rendent très difficilement Garantie Cela ne se produira pas, sans préciser en verrouillage multi-processus. Cependant, vous pouvez généralement réduire beaucoup le problème.

La cause la plus courante de ceci est la mise en mémoire tampon d'E / S, dans Python ou Libc. Par exemple, il peut être soumoué 16K de sortie, puis écrit à la fois l'ensemble du bloc. Vous pouvez réduire cela en flushing stdout après l'avoir écrit, mais c'est gênant. En théorie, vous devriez être capable de passer -u à Python pour désactiver la mise en mémoire tampon stdout, mais cela n'a pas fonctionné quand je l'ai essayé. Voir la réponse de Sebastjan à Désactiver la mémoire tampon de sortie pour une solution plus générique (bien qu'il existe probablement un moyen de désactiver la mise en mémoire tampon de sortie plus directement).

Un deuxième problème est que les écrivies sous-jacentes ne sont pas toujours atomiques. En particulier, les écrites aux tuyaux ne sont qu'aux atomiques jusqu'à une certaine taille (tuyau_buf, généralement 512 octets); au-dessus que ce n'est pas garanti. Cela ne s'applique que de manière stricte aux tuyaux (non de fichiers), mais les mêmes problèmes généraux s'appliquent: les écritures plus petites sont plus susceptibles de se produire atomiquement. Voir http://www.opengroup.org/onlinepubs/000095399/fonctions/write .html .


0 commentaires

1
votes

Le problème est que la sortie de Xargs est mélangée. GNU parallèle est fait pour résoudre ce problème. Par défaut, il garantit que la sortie n'est pas mélangée. Donc, vous pouvez simplement faire cela:

find folder/ | parallel -P10 ./logger.py > collab


0 commentaires