From aec38554a0591d9511b43f4893cce734d0ff3a23 Mon Sep 17 00:00:00 2001 From: corentinlger Date: Mon, 5 Feb 2024 22:53:03 +0100 Subject: [PATCH] Add locking and event systems for data update and remove useless files --- client.py | 27 -------- server.py | 63 ------------------- .../client.py | 0 .../server.py | 32 +++++++--- 4 files changed, 22 insertions(+), 100 deletions(-) delete mode 100644 client.py delete mode 100644 server.py rename {send_real_time_data => server_client_connection}/client.py (100%) rename {send_real_time_data => server_client_connection}/server.py (53%) diff --git a/client.py b/client.py deleted file mode 100644 index a5c93e3..0000000 --- a/client.py +++ /dev/null @@ -1,27 +0,0 @@ -import socket -import pickle -import time - -from MultiAgentsSim.simulation import Simulation - -SERVER = '10.204.2.189' -PORT = 8080 -ADDR = (SERVER, PORT) - -client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -client.connect(ADDR) - -try: - while True: - data = client.recv(4096) - if not data: - break - - grid, agents_pos, num_agents = pickle.loads(data) - print(f"Received data") - Simulation.visualize_sim(grid, agents_pos, num_agents) - -except Exception as e: - print(f"Error: {e}") -finally: - client.close() diff --git a/server.py b/server.py deleted file mode 100644 index a034512..0000000 --- a/server.py +++ /dev/null @@ -1,63 +0,0 @@ -import socket -import pickle -import threading -import time - -from jax import random - -from MultiAgentsSim.simulation import Simulation -from MultiAgentsSim.agents import Agents - -NUM_AGENTS = 5 -MAX_AGENTS = 10 -GRID_SIZE = 20 -NUM_STEPS = 50 -VIZUALIZE = True -VIZ_DELAY = 0.000001 -SEED = 0 - -key = random.PRNGKey(SEED) -sim = Simulation(MAX_AGENTS, GRID_SIZE) -agents = Agents(MAX_AGENTS, GRID_SIZE) - -grid = sim.init_grid(GRID_SIZE) -agents_pos, agents_states, num_agents = agents.init_agents(NUM_AGENTS, MAX_AGENTS, key) - -def handle_client(conn, addr, agents_pos, num_agents, key): - print(f"Connected by {addr}") - - for step in range(NUM_STEPS): - key, a_key, add_key = random.split(key, 3) - - actions = agents.choose_action(agents_pos, a_key) - agents_pos = sim.move_agents(agents_pos, actions) - pickled_data = pickle.dumps((grid, agents_pos, num_agents)) - conn.send(pickled_data) - print(f"Sent data") - time.sleep(0.5) - - conn.close() - -try: - print(f"Server is listening ...") - - SERVER = '10.204.2.189' - PORT = 8080 - ADDR = (SERVER, PORT) - - server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server.bind(ADDR) - server.listen(1) - - while True: - conn, addr = server.accept() - - client_thread = threading.Thread(target=handle_client, args=(conn, addr, agents_pos, num_agents, key)) - client_thread.start() - server.close() - -except Exception as e: - print(f"Error: {e}") - -finally: - server.close() diff --git a/send_real_time_data/client.py b/server_client_connection/client.py similarity index 100% rename from send_real_time_data/client.py rename to server_client_connection/client.py diff --git a/send_real_time_data/server.py b/server_client_connection/server.py similarity index 53% rename from send_real_time_data/server.py rename to server_client_connection/server.py index 69c35c4..6f7514d 100644 --- a/send_real_time_data/server.py +++ b/server_client_connection/server.py @@ -19,30 +19,42 @@ def generate_random_array(): return np.random.randint(0, 10, size=(5, 5)) -def broadcast(data): - pickled_data = pickle.dumps(data) - for client in clients: - client.send(pickled_data) - print(f"sent {data} to server") +def update_latest_data(): + global latest_data + while True: + with data_lock: + latest_data = generate_random_array() + new_data_event.set() + time.sleep(1) def handle_client(client): while True: try: - data = generate_random_array() - broadcast(data) - time.sleep(1) + new_data_event.wait() + with data_lock: + data = latest_data + client.send(pickle.dumps(data)) + new_data_event.clear() + except socket.error as e: print(f"error: {e}") client.close() print(f"Client {client} disconnected") break -clients = [] +# Create a global variable to store the current data + lock and event to access it +latest_data = generate_random_array() +data_lock = threading.Lock() +new_data_event = threading.Event() + +# Create a thread to continuously update the data +update_data_thread = threading.Thread(target=update_latest_data) +update_data_thread.start() +# Start listening to clients and launch their threads while True: try: client, addr = server.accept() - clients.append(client) print(f"Connected with {addr}") client_thread = threading.Thread(target=handle_client, args=(client, ))