bisher habe ich meistens für multiprocess Anwendungen multiprocess.Queue verwendet oder manchmal so etwas wie shared variables bzw. multiprocessing.Value.
Meine Frage ist mehr theoretischer Natur, ich möchte das einfach etwas besser verstehen.
Angenommen ich plane so eine Art Online Game Server für mehrere Spieler, welche effizienten Methoden würden sich anbieten, für eine Interprocess Kommunikation. Queues habe ich meist genutzt, da Threadsafe, allerdings bin ich mir in dem Punkt, in welchem die Daten verarbeitet werden sollen, für das Game, noch unschlüssig. Ich gehe hier jetzt mal mit der folgender Annahme in dieses Szenario, dass Threads nicht performant genung sind, weil GIL usw., dass muss nicht so sein, ist nur eine rein theoretische Annahme.
Ich habe dazu bereits mal GPT befragt und mir mit dessen Hilf ein Beispiel zusammen friemeln lassen, unklar für mich ist allerdings immer noch, ob ich so ein projekt nicht doch lieber in c++ oder GO schreiben sollte, um Multithreading auch auf mehreren Kernen nutzen zu können und den Vorteil, dass der Speicherbereich von den Threads geteilt wird?
Was würdet ihr machen, wenn ihr hypothetisch vor solch einem Problem stehen würdet?
Code: Alles auswählen
import socket
import threading
import multiprocessing
import time
class GameServer:
def __init__(self):
self.clients = {} # dictionary to store client address -> socket connection
self.game_state = {} # dictionary to store game state
def update_game_state(self, data, client_address):
# Update game state based on data received
# In a real game, there would be complex logic to update the game state
# Here we just echo the received data
self.game_state[client_address] = data
def handle_client(self, client_socket, client_address):
while True:
data = client_socket.recv(1024) # receive data from the client
if not data:
break
# Update game state in a separate process
p = multiprocessing.Process(target=self.update_game_state, args=(data, client_address))
p.start()
p.join()
# Send updated game state to all clients
for other_client_socket in self.clients.values():
other_client_socket.sendall(data)
client_socket.close()
del self.clients[client_address]
def run_server(self, host='localhost', port=12345):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.bind((host, port))
server_socket.listen()
while True:
client_socket, client_address = server_socket.accept()
self.clients[client_address] = client_socket
threading.Thread(target=self.handle_client, args=(client_socket, client_address)).start()
# Run the server
game_server = GameServer()
game_server.run_server()
Freue mich über Feedback und Erklärungen, vielen Dank im Voraus!