45 votes

Traitement parallèle depuis une file de commandes sous Linux (bash, python, ruby ... peu importe)

J'ai une liste/liste d'attente de 200 commandes que j'ai besoin pour s'exécuter dans un shell sur un serveur Linux.

Je ne veux avoir un maximum de 10 processus en cours d'exécution (à partir de la file d'attente) à la fois. Certains processus prend quelques secondes, d'autres processus prendra beaucoup plus de temps.

Lorsqu'un processus est terminé, je veux que la prochaine commande pour être "sauté" à partir de la file d'attente et exécuté.

Quelqu'un aurait-il le code pour résoudre ce problème?

La poursuite de l'élaboration:

Il y a 200 pièces de travail qui doit être fait, dans une file d'attente de quelque sorte. Je veux avoir au plus 10 pièces de des travaux en cours à la fois. Lorsqu'un thread termine un morceau de travail, il doit demander à la file d'attente pour le prochain morceau de travail. Si il n'y a plus de travail dans la file d'attente, le fil doit mourir. Lorsque tous les fils sont morts il désigne l'ensemble du travail a été fait.

Le réel problème, je vais essayer de résoudre utilise imapsync pour synchroniser 200 boîtes aux lettres à partir d'un vieux serveur de messagerie vers un nouveau serveur de messagerie. Certains utilisateurs ont de grandes boîtes aux lettres et de prendre du temps pour la synchronisation, d'autres ont de très petites boîtes aux lettres et de synchroniser rapidement.

45voto

Sur la coque, xargs peut être utilisé pour la file d'attente parallèle le traitement de la commande. Par exemple, pour avoir toujours 3 couchages en parallèle, de couchage pour 1 seconde, et l'exécution de 10 couchages au total ne

echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _

Et il allait dormir pendant 4 secondes au total. Si vous avez une liste de noms, et que vous souhaitez transmettre les noms de commandes exécutées, de nouveau l'exécution de 3 commandes en parallèle, faire

cat names | xargs -n1 -P3 process_name

L'exécution de la commande process_name alice, process_name bob et ainsi de suite.

41voto

ErgoSum Points 416

J'imagine que vous pouvez le faire en utilisant make et la commande make -j xx.

Peut-être un makefile comme ça

 all : usera userb userc....

usera:
       imapsync usera
userb:
       imapsync userb
....
 

make -j 10 -f makefile

28voto

Ole Tange Points 221

Le parallèle est fabriqué exclusivement à cet effet.

 cat userlist | parallel imapsync
 

L’un des avantages de Parallel par rapport aux autres solutions est qu’il garantit que la sortie n’est pas mélangée. Faire traceroute en parallèle fonctionne très bien, par exemple:

 (echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute
 

7voto

GNU make (et peut-être aussi d'autres implémentations) a l'argument -j, qui détermine le nombre de tâches à exécuter simultanément. Quand un travail est terminé, make en démarrera un autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X