Partage de variable entre les threads
Résolu
TR_2000
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'essaie de réaliser un serveur qui récupère des données via liaison UDP et qui les transmet à plusieurs clients web via websockets.
J'utilise pour cela les threads, un pour récupérer les données UDP et d'autres pour chaque client connecté (pour l'instant il n'y en a qu'un)
Je stocke alors les données reçues dans la variable "msg_gnuradio" dans le premier thread et je souhaite l'envoyer vers le client dans le second thread avec websocket.send().
Le problème est que la variable msg_gnuradio ne s'actualise que dans le thread UDP (on le voit bien si je l'affiche sur la console) mais dans le thread websocket elle n'est pas modifiée et j'envoie toujours "o" vu que c'est ce que j'ai initialisé.
J'ai essayé plusieurs méthodes en utilisant "global" mais cela ne fonctionne pas ou bien je ne l'utilisait pas correctement...
Pouvez-vous m'aider s'il vous plait ?
Merci d'avance
J'essaie de réaliser un serveur qui récupère des données via liaison UDP et qui les transmet à plusieurs clients web via websockets.
J'utilise pour cela les threads, un pour récupérer les données UDP et d'autres pour chaque client connecté (pour l'instant il n'y en a qu'un)
Je stocke alors les données reçues dans la variable "msg_gnuradio" dans le premier thread et je souhaite l'envoyer vers le client dans le second thread avec websocket.send().
#Ajout des librairies :
import socket #pour les sockets
import websockets #pour les websockets
import asyncio #pour les fonctions asynchrones (qui s'execute dans n'importe quel ordre)
import time #pour le sleep()
from threading import Thread
msg_gnuradio = "o"
#Fonction liée au thread UDP
def listen_udp():
len_data = 1024
#Création socket UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#Lier la socket à l'adress IP et le port
s.bind(('localhost', 1234))
print("Serveur UDP à l'écoute")
while(True):
addr = s.recvfrom(len_data)
msg_gnuradio = format(addr)
# print(msg_gnuradio)
time.sleep(1)
#Fonction liée au thread WEB
async def listen_ws(websocket, path):
try:
print("fonction listen_ws")
msg_client = await websocket.recv()
print("< " + msg_client)
i = 0
while True:
try:
await websocket.send(format(i)+" : "+msg_gnuradio)
# print("> datas envoyées")
time.sleep(1)
i = i+1
except KeyboardInterrupt:
print("Exiting program...")
finally:
await websocket.send("Le serveur n'est pas connecté à GNURadio")
def start_loop(loop, server):
loop.run_until_complete(server)
loop.run_forever()
#Lancement Thread UDP
udp = Thread(target=listen_udp) #Création thread pour l'UDP
udp.start()
# start a new event loop
new_loop = asyncio.new_event_loop()
#Lancement Thread WEB
port_websockets = 8000 #port pour les connexions websocket
nb_clients = 0 #nombre de clients connecté
start_server = websockets.serve(listen_ws, "localhost", port_websockets, loop=new_loop)
web = Thread(target=start_loop, args=(new_loop, start_server))
web.start()
print("Serveur websocket à l'écoute sur le port " + str(port_websockets))
for i in range(10):
print(i)
time.sleep(2)
Le problème est que la variable msg_gnuradio ne s'actualise que dans le thread UDP (on le voit bien si je l'affiche sur la console) mais dans le thread websocket elle n'est pas modifiée et j'envoie toujours "o" vu que c'est ce que j'ai initialisé.
J'ai essayé plusieurs méthodes en utilisant "global" mais cela ne fonctionne pas ou bien je ne l'utilisait pas correctement...
Pouvez-vous m'aider s'il vous plait ?
Merci d'avance
A voir également:
- Partage de variable entre les threads
- Partage de photos - Guide
- Meilleur site partage abonnement - Accueil - Services en ligne
- Partage d'écran whatsapp pc - Accueil - Messagerie instantanée
- Partage reseau - Guide
- Album partagé google - Guide
2 réponses
Bonjour,
IndentationError: la ligne 19 est indentée de 4 espaces mais tout le reste l'est d'une tabulation
on le voit en faisant un copié/collé de ton code
IndentationError: la ligne 19 est indentée de 4 espaces mais tout le reste l'est d'une tabulation
on le voit en faisant un copié/collé de ton code
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
Peux-tu montrer comment tu as utilisé "global"?
Peux-tu préciser le langage quand tu utilises les balises de code? https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Peux-tu montrer comment tu as utilisé "global"?
Peux-tu préciser le langage quand tu utilises les balises de code? https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Bonjour,
D'accord j'y penserai la prochaine fois pour le code..
J'ai utilisé le terme global dans la fonction listen_udp pour déclarer la variable à l'intérieur mais j'ai eu une erreur "d'intdentation" alors je me suis dit que ça ne devait pas se placer ici.
J'ai essayé un peu partout après, sans succès...
D'accord j'y penserai la prochaine fois pour le code..
J'ai utilisé le terme global dans la fonction listen_udp pour déclarer la variable à l'intérieur mais j'ai eu une erreur "d'intdentation" alors je me suis dit que ça ne devait pas se placer ici.
J'ai essayé un peu partout après, sans succès...
Voici le code avec la variable global msg_gnuradio dans les 2 fonctions :
et l'erreur est :
python3 server_thread.py
File "server_thread.py", line 19
global msg_gnuradio
^
IndentationError: unindent does not match any outer indentation level
#Ajout des librairies : import socket #pour les sockets import websockets #pour les websockets import asyncio #pour les fonctions asynchrones (qui s'execute dans n'importe quel ordre) import time #pour le sleep() from threading import Thread #Fonction liée au thread UDP def listen_udp(): len_data = 1024 #Création socket UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #Lier la socket à l'adress IP et le port s.bind(('localhost', 1234)) print("Serveur UDP à l'écoute") global msg_gnuradio while(True): addr = s.recvfrom(len_data) msg_gnuradio = format(addr) # print(msg_gnuradio) time.sleep(1) #Fonction liée au thread WEB async def listen_ws(websocket, path): try: msg_client = await websocket.recv() print("< " + msg_client) i = 0 global msg_gnuradio while True: try: await websocket.send(format(i)+" : "+msg_gnuradio) # print("> datas envoyées") time.sleep(1) i = i+1 except KeyboardInterrupt: print("Exiting program...") finally: await websocket.send("Le serveur n'est pas connecté à GNURadio") def start_loop(loop, server): loop.run_until_complete(server) loop.run_forever() #Lancement Thread UDP udp = Thread(target=listen_udp) #Création thread pour l'UDP udp.start() # start a new event loop new_loop = asyncio.new_event_loop() #Lancement Thread WEB port_websockets = 8000 #port pour les connexions websocket nb_clients = 0 #nombre de clients connecté start_server = websockets.serve(listen_ws, "localhost", port_websockets, loop=new_loop) web = Thread(target=start_loop, args=(new_loop, start_server)) web.start() print("Serveur websocket à l'écoute sur le port " + str(port_websockets)) for i in range(10): print(format(i)+" : " +msg_gnuradio) time.sleep(2)
et l'erreur est :
python3 server_thread.py
File "server_thread.py", line 19
global msg_gnuradio
^
IndentationError: unindent does not match any outer indentation level