Bonsoir tout le monde.
J'ai actuellement une fonction lourde et mal optimisée. Mais je bosse déjà là dessus et je pense que malgré tous mes efforts le temps d'exécution restera conséquent (ça se chiffre en minutes...au moins). Mais c'est une autre histoire. Cette fonction doit être appelée un nombre conséquent de fois. Je pense que diviser les tâches en plusieurs processus indépendants est particulièrement indiqué dans ce cas (vous pouvez me détromper, il n'y a pas de soucis).
J'ai fait quelques recherches sur le module multiprocessing de python. Mais je ne suis jamais tombé exactement sur ce que je cherche. Voici mon besoin: admettons que j'ai une liste de tâches à effectuer, un nombre inconnus nécessitant une durée d'exécution inconnue. J'aimerais pouvoir simplement lancer en parallèle un nombre défini de processus et ainsi traiter l'ensemble des tâches. Dans l'idéal, une fois une tâche de finie une autre se lance même si les autres tournent toujours. Mais il faudrait qu'il n'y jamais plus de n processus en même temps.
Je ne crois pas au père noël, ça doit très sûrement existé. Mon petit doigt me dit d'utiliser pool(), mais les exemples que j'ai pu lire ne m'ont pas convaincus.
Pour le moment je suis parvenu à bricoler quelque chose qui traite mes tâches par blocs de n processus. C'est déjà pas mal même si pas très académique:
J'utilise ici Manager() pour partager entre les processus un même dictionnaire. Actuellement mes résultats sont sortis sous cette forme, donc ça m'arrange bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from multiprocessing import Process, Manager import time import random def heavy_func(case_id, jobs_done): """Dummy heavy function""" time.sleep(random.randint(1,10)) jobs_done[case_id] = 'Done' if __name__ == '__main__': jobs_to_do = ['Case%i' % (i,) for i in range(10)] jobs_done = Manager().dict() n_procs = 2 procs = [Process(target=heavy_func, args=(c, jobs_done)) for c in jobs_to_do] for i in range(0, len(jobs_to_do), n_procs): for p in procs[i:i+n_procs]: p.start() for p in procs[i:i+n_procs]: p.join() print jobs_done
Ju
Partager