J'ai essayé de lire la documentation sur http://docs.python.org/dev/library/multiprocessing.html mais je suis toujours aux prises avec le multiprocessing Queue, Pool et Locking. Et pour l'instant, j'ai pu construire l'exemple ci-dessous.
En ce qui concerne la file d'attente et le pool, je ne suis pas sûr d'avoir bien compris le concept, donc corrigez-moi si je me trompe. Ce que j'essaie de réaliser, c'est de traiter 2 demandes à la fois (la liste de données en contient 8 dans cet exemple), que dois-je utiliser? Pool pour créer 2 processus capables de gérer deux files d'attente différentes (2 au maximum) ou devrais-je simplement utiliser Queue pour traiter 2 entrées à chaque fois? Le verrou serait d'imprimer correctement les sorties.
import multiprocessing
import time
data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_handler(var1):
for indata in var1:
p = multiprocessing.Process(target=mp_worker, args=(indata[0], indata[1]))
p.start()
def mp_worker(inputs, the_time):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
if __name__ == '__main__':
mp_handler(data)
la source
var1
complètement, faisant référence à global à ladata
place.Cela n'est peut-être pas lié à 100% à la question, mais lors de ma recherche d'un exemple d'utilisation du multitraitement avec une file d'attente, cela apparaît en premier sur Google.
Il s'agit d'un exemple de classe de base que vous pouvez instancier et placer des éléments dans une file d'attente et attendre la fin de la file d'attente. C'est tout ce dont j'avais besoin.
la source
item1
etitem2
? S'agit-il d'une sorte de tâche ou de fonctions, qui seront exécutées dans deux processus différents?Voici mon goto personnel pour ce sujet:
Gist here, (pull requests bienvenus!): Https://gist.github.com/thorsummoner/b5b1dfcff7e7fdd334ec
la source
get()
est un délai d'expiration, il n'a rien à voir avec le nombre de travaux démarrés..get(timeout=1)
? et est-il correct de dire simplement.get()
pour obtenir la liste complète?.get()
attend indéfiniment jusqu'à ce que tous les résultats soient disponibles et renvoie la liste des résultats. Vous pouvez utiliser une boucle d'interrogation pour vérifier que les résultats météorologiques sont disponibles, ou vous pouvez transmettre une fonction de rappel dans l'map_async()
appel qui sera ensuite appelée pour chaque résultat une fois qu'il sera disponible.Pour tous ceux qui utilisent des éditeurs comme Komodo Edit (win10), ajoutez
sys.stdout.flush()
à:ou en première ligne pour:
Cela permet de voir ce qui se passe pendant l'exécution du script; au lieu d'avoir à regarder la boîte de ligne de commande noire.
la source
Voici un exemple de mon code (pour le pool de threads, mais changez simplement le nom de la classe et vous aurez un pool de processus):
Fondamentalement:
pool = ThreadPoolExecutor(6)
crée un pool pour 6 threadspool.submit(execute_run, rp)
ajoute une tâche au pool, le premier argument est une fonction appelée dans un thread / processus, le reste des arguments est passé à la fonction appelée.pool.join
attend que toutes les tâches soient terminées.la source
concurrent.futures
, mais que l'OP pose des questions surmultiprocessing
et Python 2.7.