Bonjour à tous,
Je travaille actuellement sur un script dont le but est de transmettre des instructions à un serveur, avec websocket.
Voici comment j'ai vu les choses :
- Je démarre mon script, qui demande l'exécution d'une première instruction (demande de sauvegarde)
- La connexion au serveur est initialisée, une boucle infinie transmet les instructions et récupère les résultats. On demande d'afficher le contenu de la console présente sur le serveur afin de pouvoir récupérer les résultats des instructions.
- La connexion au serveur est faite, la première instruction de mon script est transmise (demande de sauvegarde) et attend les résultats
- La boucle infinie récupère l'instruction, la transmet au serveur qui l'interprète et retourne les résultats
- Le résultat est retournée à la fonction qui a demandé la sauvegarde
- [...]
Mon problème est que je bloque à l'étape 2, le script étant paralysé par le thread contenant la boucle infinie.
Pourquoi cela fait ça en sachant que j'ai justement mis la fonction concernée dans un nouveau thread (module threading) ?
La gestion de la connexion au serveur (avec un nouveau thread)
Mon thread principal appele "start_ws_client()", qui lance la tâche asynchrone dans un nouveau thread.
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 def start_ws_client(self): if not self.is_started_ws_client: self.stop_ws_client = False thread_ws = threading.Thread(target= asyncio.run(self.ws_client())) thread_ws.start() async def ws_client(self): url = self.get_websocket_url() cc = self.get_console_connection() async with websockets.connect(url, additional_headers= cc.get_headers(), origin=cc.get_https_url_server()) as ws: command = json.dumps({ 'event': 'auth', 'args': [self.websockets_token] }) await ws.send(command) response = await ws.recv() auth_response = json.loads(response) if not auth_response['event'] == 'auth success': raise TypeError('Auth failed') self.is_started_ws_client = True while not self.stop_ws_client: response = await ws.recv() msg = json.loads(response) if msg['event'] == 'console output': self.logs.append(msg['args'][0]) self.is_started_ws_client = False
En l'état actuel, la connexion au serveur est bien faite, je récupère des données sur la santé du serveur mais pour pouvoir transmettre mes instructions, je dois pouvoir exécuter du code en dehors de la boucle, tout en sachant qu'elle doit rester active (d'où l'usage d'un nouveau thread).
Avez-vous une idée ?
Merci.
Partager