Interférence entre deux programmes
J'ai observé une interférence entre deux de mes programmes exécutés dans deux fenêtres IDLE.
Ces deux programmes traitent des codes sources de pages web: ils font des interrogations aléatoires d'un même site internet mais ils ne consultent pas les mêmes pages. C'est pour cela qu'ils ont en fait quasiment le même code, c'est à dire la même suite d'instructions, la seule différence résidant dans la valeur de certaines chaines de caractères qui définissent les pages à consulter. Tels qu'ils sont écrits, il est tout à fait impossible que les deux programmes consultent une même page précise, même à des moments différents.
Or j'ai observé une interférence entre ces deux programmes après les avoir truffés d'instructions pour enregistrer le déroulement de leur exécution dans un fichier log.
Au sein d'une fonction, le programme A a exécuté une instruction x = ln[9:13] pour extraire un nombre situé dans une ligne du code source d'une certaine page P1 du site consulté.
La suite aurait dû être le renvoi de la valeur trouvée par la fonction,
mais au lieu de cela, il y a eu une deuxième exécution de la même instruction x = ln[9:13] , mais cette fois-ci avec une valeur ln différente.
Cette dernière valeur était celle d'une ligne du code source d'une autre page PX du même site, page entièrement différente de P1 et qu'il n'est absolument pas prévu que le programme A puisse consulter: algorithmiquement parlant, il est impossible au programme A de lire la page PX.
La fonction a donc extrait un nouveau nombre de cette nouvelle valeur de la variable ln et renvoyé ce nouveau nombre. Celui-ci ne correspondant à rien d'attendu dans le programme A, ce dernier a planté.
Je me suis aperçu qu'au même moment le programme B qui tournait dans une autre fenêtre a consulté la page PX, ce qui est tout à fait prévu par son algorithme, et il n'y avait donc rien d'anormal dans cette consultation.
Le problème est donc qu'une ligne du code source d'une page traitée par B à un instant précis s'est retrouvée être traitée de façon anormale aussi par le programme A au même instant précis.
=================
Avant de poser ma question, j'ai fait des recherches et je suis tombé sur:
« IDLE peut être utilisé pour exécuter vos programmes mais n'en abusez pas. Je le déconseille si vous devez lancer des programmes assez lourd ou contenant une interface graphique, IDLE étant programmé en Tkinter, il peut arriver qu'il y ait des interférences entre votre programme et Tkinter. Il y a ainsi parfois des bogues qui surviennent à cause de l'exécution d'un script sous IDLE. »
http://guigui.developpez.com/Tutorie...PythonWindows/
Je n'ai pas l'impression que mes programmes soient très lourds et ils ne comportent rien de graphique, sauf des lignes de caractères qui apparaissent dans la fenêtre IDLE pour rendre compte des événements.
Mais cet extrait semble s'appliquer à mon cas.
*** Pouvez vous me dire si le problème que j'ai décrit
- est susceptible d'être lié à la façon dont les programmes sont exécutés sous IDLE
- ou s'il pourrait y avoir une histoire de débordement ou de chevauchement de zones mémoires. J'ai lu des choses de ce genre mais je n'y comprends goutte.
Si c'est dû à IDLE, c'est embêtant parce que je n'aime pas la fenêtre noire du Shell qui ne garde pas la totalité des lignes affichées à mesure quand leur succession est trop longue.
Comment faire alors pour éviter ces interférences ?
======================
J'ai commencé à m'intéresser aux threads.
J'ai vu dans le module threads la fonction start_new_thread( function, args[, kwargs])
Je n'y comprends pas grand chose encore.
Je me demandais s'il n'y a pas le moyen de forcer une exécution à se faire dans des limites bien précises (un thread ?) , sans déborder sur de la mémoire ou un processus appartenant à un autre programme.
Que fait start_new_thread( function, args[, kwargs]) ?
Merci d'avoir lu jusqu'ici.