Le problème va se corser vers la fin...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
if __name__ == '__main__':
Ceci est extrêmement sympathique pour indiquer le début d'un programme. Chaque langage a sont petit truc à lui pour démarrer.

En C++ il faut bien écrire le non moins sympathique :

Néanmoins, la personne qui m'a aidé à faire mes premiers pas en Python m'avait parlé d'une simple convention, voire d'une habitude pratique pour indiquer le début d'un programme. Il s'agissait presque d'une simple repère visuel.

Effectivement, il est possible en Python, contrairement au C++, de se passer du "bloc main".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
#include <stdio.h>
using namespace std;
 
int main()
{
   printf("hello");
}
J'ai ensuite appris qu'en Python, le "bloc main" pouvait être utile dans les module.
http://effbot.org/pyfaq/tutor-what-i...e-main-for.htm
Ainsi on peut écrire un bloc de test dans les modules, et celui-ci ne sera pas exécuté lorsque le module sera exécuté pas le programme principal.

On peut donc toujours se passer du "bloc main" dans le programme principal et se contenter d'un gros commentaire qui indique visuellement le début de l'exécution pour le cas où il y aurait beaucoup de choses déclarées avant, ça peut être utile pour naviguer rapidement dans le code.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
imports...
 
déclarations...
 
##################################
###   Début de mon programme   ###
##################################
 
print "hello"
On peut aussi mettre toutes les déclarations dans un module. Ainsi le programme débute au début du fichier principale.
Enfin, chacun fait comme il veut.

Maintenant, voici un programme qui marche :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
from multiprocessing import Process, Lock
 
def f ( l, txt, nbr ):
    for i in range(nbr):
        l.acquire()
        print( "%s_%i" % (txt, i) )
        l.release()
 
if __name__ == '__main__':
    lock = Lock()
    Process(target=f, args=( lock, "XXX", 10 )).start()
    Process(target=f, args=( lock, "III", 10 )).start()
Maintenant, voici un programme qui ne marche pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
from multiprocessing import Process, Lock
 
def f ( l, txt, nbr ):
    for i in range(nbr):
        l.acquire()
        print( "%s_%i" % (txt, i) )
        l.release()
 
lock = Lock()
Process(target=f, args=( lock, "XXX", 10 )).start()
Process(target=f, args=( lock, "III", 10 )).start()

Quelqu'un a-t-il une explication ?


Vous noterez que le programme suivant marche très bien.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
from threading import Thread, Lock
 
def f ( l, txt, nbr ):
    for i in range(nbr):
        l.acquire()
        print( "%s_%i" % (txt, i) )
        l.release()
 
lock = Lock()
Thread(target=f, args=( lock, "XXX", 10 )).start()
Thread(target=f, args=( lock, "III", 10 )).start()
.