Le problème va se corser vers la fin...
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".
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.
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 :
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 :
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.
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() |
.
Partager