IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Arreter thread via autre fichier python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 7
    Par défaut Arreter thread via autre fichier python
    Bonjour a tous !

    J'ai un code comportant plusieurs threads qui tourne en boucle et je souhaite les stopper proprement a la fin des threads. Dans le contexte où mon code travail, le plus simple (a mon avis) serait de lancer un autre fichier python qui vient arrêter les threads de l'autre fichier. J'ai cherché sur divers site mais pas possible de trouver une solution :/

    Contrainte !! Je bosse sur un module hardware que j'ai conçu et suis contrait de travailler en python2...

    Voici mon code:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    #!/usr/bin/python2.7
    #-*-coding:Latin-1-*
     
    import random
    import sys
    from threading import Thread
    import time
    import datetime
    import time
    import os
    import re
    import sqlite3
    import signal
    import sys
    from subprocess import check_output
    from servSMS import envSMS
    from Cryptage import crypt, decrypt
    from SNMP import request
     
    class Interface(Thread):
     
     
    	def __init__(self):
    		Thread.__init__(self)
     
    	def run(self):
    		conn1 = sqlite3.connect('/mnt/Disk2/mysql/Equipements.db')
    		c1 = conn1.cursor()
    		print ('Ouverture de Equipements.db')
     
    		conn2 = sqlite3.connect('/mnt/Disk2/mysql/Historique.db', check_same_thread=False)
    		c2 = conn2.cursor()
    		print ('Ouverture de Historique.db')
     
    		conn3 = sqlite3.connect('/mnt/Disk2/mysql/Oid.db')
    		c3 = conn3.cursor()
    		print ('Ouverture de Oid.db')
     
    		model = ('SW',)
    		catRef = ('4',)
    		if __name__== "__main__":
    			while (1):
    				for OidByCat in c3.execute('SELECT * FROM Oid WHERE Cat=?', catRef):
    					for row in c1.execute('SELECT * FROM Equipements WHERE Type=?', model):
    						print ('Int|ID: '+ row[0] + " adresse -> " + row[3])
     
    						# Requete
    						reponseglob = str(request(str(row[3]), OidByCat[1]))
    						print (reponseglob)
    						print ('Int|fin pour '+ row[3])
     
    						# Traitement réponse
    						tmp = reponseglob.split(')')
    						i = 0
    						for reponse in tmp:
    							# Id interface
    							i += 1
    							interface = str(row[0]) + 'i' + str(i)
     
    							# Valeur interface
    							val = reponse[-1:]
     
    							# Date
    							date = datetime.datetime.now()
     
    							#Construction ligne 
    							ligne = [row[0], row[1], row[2], row[3], interface, str(val), str(date)]
     
    							# Comparaison avec dernière val
    							lastInterface = (interface,)
    							c2.execute('SELECT * FROM Historique WHERE Interface = ? ORDER BY IdHist DESC', lastInterface)
    							lastVal = c2.fetchone()
    							if str(lastVal[6]) != val:
    								print ('Attention changement d\'état interface:' + interface + 'du SW' + str(row[0]))
    								print ('Dernière entrée dans la BDD: ')
    								print lastVal
    								print ('Requete actuelle: ')
    								print ligne
    								print ('Comparaison entre ' + lastVal[6] + ' et ' + val)
     
    								# Construction du message
    								msg = ('NC1052 NA183 NE' + str(row[0]) + ' ' + str(row[1]) + ' ' + str(row[3]) + ' ' + interface +' -> Perte connexion le ' + date)
     
    								# Envoie du SMS
    								envSMS('+33767301164', msg)
    							c2.execute("INSERT INTO Historique (IdEq, Nom, Type, Ip, Interface, Val, Dat) VALUES (?, ?, ?, ?, ?, ?, ?);", ligne)
    							conn2.commit()
    					time.sleep(3)
     
     
    class Temp(Thread):
     
    	def __init__(self):
    		Thread.__init__(self)
     
    	def run(self):
     
    		## Ouverture des BDD
    		conn1 = sqlite3.connect('/mnt/Disk2/mysql/Equipements.db')
    		c1 = conn1.cursor()
    		print ('Ouverture de Equipements.db')
     
    		conn2 = sqlite3.connect('/mnt/Disk2/mysql/Historique.db', check_same_thread=False)
    		c2 = conn2.cursor()
    		print ('Ouverture de Historique.db')
     
    		conn3 = sqlite3.connect('/mnt/Disk2/mysql/Oid.db')
    		c3 = conn3.cursor()
    		print ('Ouverture de Oid.db')
     
    		# Définition des références
    		model = ('SW',)
    		catRef = ('1',)
    		if __name__== "__main__":
    			while (1):
    				for OidByCat in c3.execute('SELECT * FROM Oid WHERE Cat=?', catRef):
    					for row in c1.execute('SELECT * FROM Equipements WHERE Type=?', model):
     
    						# Réponse générée
    						print ('Temp|ID: '+ row[0] + " adresse -> " + row[3])
    						reponseglob = str(request(str(row[3]), OidByCat[1]))
    						print (reponseglob)
    						print ('Temp|fin pour '+ row[3])
     
    						i = 'X'
    						temp = ''
    						for lettre in reponseglob[60:62]:
    							temp = temp + lettre
     
    						# Date
    						date = datetime.datetime.now()
     
    						#Construction ligne 
    						ligne = [row[0], row[1], row[2], row[3], i, temp, str(date)]
    						c2.execute("INSERT INTO Historique (IdEq, Nom, Type, Ip, Interface, Val, Dat) VALUES (?, ?, ?, ?, ?, ?, ?);", ligne)
    						conn2.commit()
    				time.sleep(5)
     
    # Création des threads
    thread_1 = Interface()
    thread_2 = Temp()
     
    # Lancement des threads
    thread_1.start()
    thread_2.start()
     
    # Attend que les threads se terminent
    thread_1.join()
    thread_2.join()
    En vous remerciant pour l'attention que vous porterez a mon message

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Le plus simple serait de tester l'existence d'un fichier: lorsqu'il a été créé (même vide) le thread se termine.

    Mais plus raisonnable(*) serait d'écrire un programme sans thread lancé à intervalles réguliers via cron (qui fournit aussi l'interface pour l'arrêter).

    (*)écrire des programmes qui tournent 24h/24 est un exercice plus difficile qu'il n'y paraît.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 7
    Par défaut
    Merci beaucoup pour l'idée de tester un fichier !! cela devrait résoudre le soucis.

    Je viens de me documenter un peu sur cron. J'ai l'impression qu'il est difficile d’ordonnancer beaucoup de taches en simultané. Je suis entrain de développer un module de supervision (je veux pas de nagios ou prtg) et j'étais parti dans l'idée de faire un fichier .py par type d'équipement et dans ces fichiers un thread par OID. L'idée c'est que tout tourne en même temps avec des intervalles de requêtes différentes selon les équipements/OID

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par LoganLB Voir le message
    Je viens de me documenter un peu sur cron. J'ai l'impression qu'il est difficile d’ordonnancer beaucoup de taches en simultané.
    Ben évidemment si T2 dépend de la réussite de T1, il te faut alors lier T1 et T2 dans le cron (ex T1 && T2).
    cron c'est pas Nagios. C'est juste un truc élémentaire permettant de lancer une tache T à une (ou plusieurs) heure(s) fixe(s) à un (ou plusieurs) jour(s) fixe(s).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 7
    Par défaut
    Je n'ai pas dis que cron et nagios sont similaires je m'excuse si je me suis mal exprimé. L'exemple avec nagios c'était juste pour expliquer que je développe un module de supervision.

    En utilisant cron, si je veux optimiser mon nombres de fichiers (et si j'ai bien compris) je vais devoir (au mieux) écrire une fichier par OIDs dont les temps entre chaque requêtes sont les mêmes. ex: RAM CPU que je récupère tous deux tout les X secondes.
    Cependant pour une question d'ergonomie je souhaites faire un fichier par type d'équipements (switch, onduleur...) avec les requêtes nécessaires.

    J'en reviens donc a ma question. Comment puis-je arrêter mes threads en lançant un autre fichier (stop.py) ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par LoganLB Voir le message
    J'en reviens donc a ma question. Comment puis-je arrêter mes threads en lançant un autre fichier (stop.py) ?
    Créer un fichier dont l'existence sera testée à chaque itération ne vous plaît pas?

    De toutes façon pour arrêter un threads, il faut soit tuer le processus soit changer l'état d'une variable du programme (qui sera testée par le thread pour terminer). Et pour changer l'état d'une variable depuis un autre programme, il faut utiliser une mécanique de communication entre processus spécifique à l'OS (ou des sockets disponibles partout). Tester l'existence d'un fichier sera la plus simple.

    Et si vous voulez mieux, changez votre conception/design...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par LoganLB Voir le message
    J'en reviens donc a ma question. Comment puis-je arrêter mes threads en lançant un autre fichier (stop.py) ?
    Une solution qui n'a pas été évoquée et que j'ai déjà utilisée, c'est de structurer:
    - le 1er programme (celui avec les threads qui tourne en permanence) comme un serveur, attendant une requête d'arrêt des threads,
    - et le 2ème programme (stop.py) lui envoyant cette requête d'arrêt.

    Pour le serveur, on n'a pas besoin d'un serveur web, un serveur TCP suffit. Et dans la mesure où un seul client peut lancer une requête, le serveur peut rester "synchrone", c'est à dire que chaque requête doit attendre que la requête précédente soit terminée, ce qui simplifie le code.

    A noter que si on n'a pas besoin d'un serveur web, celui-ci permettrait tout de même quelque chose d'intéressant: demander l'arrêt des threads non avec un programme "stop.py", mais avec n'importe quel navigateur web.

    Quelques exemples ici, qui devraient fonctionner encore en Python 2:
    http://python.jpvweb.com/mesrecettes...erveurs_divers

    Le plus simple étant celui-ci. Crée en 2008 (j'ai un retard colossal de mise à jour...), donc en Python 2:
    http://python.jpvweb.com/python/mesr...rveur_tcp_mini

    Sinon, pour que le serveur arrête ses threads, le plus simple (pour moi) est:
    - de structurer les threads comme des classes héritant de threading
    - de prévoir à l'initialisation une variable d'instance "self.encore=True"
    - de placer cette variable comme condition de poursuite de la boucle de travail ("while self.encore:") dans la méthode "run"
    - de créer une méthode supplémentaire "self.stop" du thread qui met "self.encore" à False

    Il suffit alors de lancer la méthode "stop()" du thread pour que celui-ci termine son exécution.

    A noter que dans la solution client-serveur, le client ("stop.py") peut demander au serveur d'arrêter ses threads, mais il pourrait tout aussi bien lui demander plus tard de les redémarrer! Il suffit de le prévoir dans le traitement des requêtes.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par LoganLB Voir le message
    j'étais parti dans l'idée de faire un fichier .py par type d'équipement et dans ces fichiers un thread par OID. L'idée c'est que tout tourne en même temps avec des intervalles de requêtes différentes selon les équipements/OID
    L'OID, l'action à réaliser, la fréquence pour la répéter et éventuellement le timestamp et le status de la dernière action réalisée,... sont juste des données spécifiques à chaque équipement.

    Le programme qui sait lire ces informations et lancer les actions à réaliser n'a besoin que créer qu'un petit nombre de threads (les actions à réaliser simultanément si elles durent trop longtemps).

    Et parmi ces informations, on peut avoir une colonne pour arrêter les actions sur un équipement particulier.

    Dans tous les cas, on évite d'associer le code aux données. Sinon, c'est difficile à maintenir et à faire évoluer. Après, c'est vous qui aller bosser donc, à vous de voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [XL-2010] excel - ouverture d'un autre fichier via Macro
    Par willoweiss dans le forum Excel
    Réponses: 5
    Dernier message: 18/05/2014, 19h09
  2. Réponses: 4
    Dernier message: 22/05/2012, 16h20
  3. [XL-2002] Récupération de données via un autre fichier
    Par Dexter81 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2012, 12h34
  4. [XL-2002] Mise a jour automatique d'un master fichier Excel via d'autres fichiers filles Excel
    Par magninde dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/05/2009, 14h08
  5. Réponses: 13
    Dernier message: 27/02/2008, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo