Bonjour à tous,

Je m'essaie au calcul parallèle depuis quelques jours et je rencontre un comportement inattendu. J'utilise le package multiprocessing standard sur python 2.7, et je tente d'appeler une méthode en parallèle. Cette méthode devra remplir un dictionnaire de données.

Un code simpliste dans un fichier à part fonctionne très 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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
def push_in_array(self,array,i,val):
        print 'push %s in %s' %(i,val) 
 
        n = 9999
        while n > 0:
            r = sqrt(n)
            n = n-1
 
        array[i] = val
 
    def Run(self) :
 
 
        manager = Manager()
        d = manager.dict()    
        t0 = time()     
 
 
        if self.multi:
            # Multiprocessing Mode
            print "Multiprocessing computation..." 
 
            p = {}      
            for i in range(self.nb):
 
                p[i] = Process(target = self.push_in_array, args=(d,i,5,))
                p[i].start()
 
            for i in range(self.nb):
                p[i].join()
 
            tp = round(time() - t0, 3) 
            print "Time elapsed in multiprocessing computation: %.2f\n" % tp
 
        else:
            # Serial Mode
            print "Serial computation..." 
 
            for i in range(self.nb):
 
                push_in_array(d,i,5)            
 
            tp = round(time() - t0, 3) 
            print "Time elapsed in serial computation: %.2f\n" % tp
 
        print d
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Multiprocessing computation...
push 0 in 5
push 1 in 5
push 2 in 5
push 4 in 5
push 3 in 5
Time elapsed in multiprocessing computation: 0.89
 
{0: 5, 1: 5, 2: 5, 3: 5, 4: 5}
l'intégration de ce code dans ma librairie entraine par contre un comportement étrange, le premier proc reprend depuis le début du programme à son start(), puis revenu à l'endroit du fork(), le nouveau fils recommence encore, et encore ... et le code n'avance pas finalement.

Avez vous déja rencontrer ce genre de problème ?