J'utilise quelque chose comme ceci: intérieur au lieu de cela, les lignes sont parfois jumblées: p> Comment puis-je empêcher / corriger ceci ? p> p> logger.py code> Je traite les fichiers sortant des lignes reformatées. Alors collab devrait ressembler à p>
3 Réponses :
La solution compliquée et techniquement correcte serait de mettre en œuvre un mutex pour écrire, mais c'est sous-optimal, je pense. P>
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? P>
En général, il y a des problèmes qui rendent très difficilement Garantie em> Cela ne se produira pas, sans préciser en verrouillage multi-processus. Cependant, vous pouvez généralement réduire beaucoup le problème. P>
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 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 . P> -u code> à 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). p>
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
Votre logger.py est-il multithreau ou quelque chose?
@aioobe:
xargs -n1 -p10 code> exécute dix processus concurrents (de
logger.py code>). Voir Xargs .
Oh, à droite, mal interpréter la page man et mélangé avec
-p code>. C'est une bonne question!
Comment la sortie est-elle effectuée dans le
logger.py code>?
@Josh, avez-vous essayé d'ajouter
flush code> après écrit ou en utilisant des objets de fichier non coupés? (BTW, c'est ce que Glenn suggère ci-dessous)