2010-07-08 8 views
1

Dans une quête pour en apprendre un peu plus sur Python et les sockets, j'écris un petit serveur de 2 jeux.Quelle est la meilleure façon de stocker rapidement des données en Python?

Et bien que je ne vois pas plus de quelques personnes sur ce serveur à un moment donné, je veux l'écrire aussi efficacement que I peut.

J'ai un dictionnaire global appelé « globuser », dans c'est un autre dictionnaire contenant les statistiques de l'utilisateur (comme les X & coordonnées Y)

Est-ce que la meilleure façon de les stocker? Quelle taille peut avoir un dictionnaire?
Je suppose que vous pourriez également essayer d'utiliser une base de données régulière, mais cela serait incroyablement lent. Ou devrais-je utiliser un schéma entièrement différent?

Est-ce que plusieurs threads peuvent accéder à la même variable en même temps ou sont-ils mis en attente?
Je suppose que lorsque de nombreux utilisateurs sont en ligne, chaque déménagement nécessite une mise à jour. Si elles peuvent arriver en même temps, génial! Mais s'ils ont chacun besoin de "verrouiller" la variable, ce serait moins génial.

Répondre

3

Une chose que je pourrais regarder est de stocker les utilisateurs comme une liste d'objets Player. Regardez dans __slots__, car cela vous permettra d'économiser de la mémoire lors de la création de nombreuses instances.

Je ne voudrais pas trop m'inquiéter de la performance à ce stade. Ecrire le code d'abord, puis l'exécuter à travers un profileur pour savoir il est le plus lent - faire des changements aveugles dans le nom de l'optimisation est mauvais Juju.

En ce qui concerne la sécurité des threads et le partage des données, j'ai trouvé this, ce qui semble donner quelques informations sur le sujet.

2

Utilisez multitraitement au lieu de filetage. Il a beaucoup d'avantages et l'un des avantages est de gérer le stockage global pour tous les processus. Ce module utilise un dictionnaire global initié par le gestionnaire.

Voici exemple échantillon prélevé PyMOTW

The Manager is responsible for coordinating shared information state between all of its users. By creating the list through the manager, the list is updated in all processes when anyone modifies it. In addition to lists, dictionaries are also supported. 

import multiprocessing 

def worker(d, key, value): 
    d[key] = value 

if __name__ == '__main__': 
    mgr = multiprocessing.Manager() 
    d = mgr.dict() 
    jobs = [ multiprocessing.Process(target=worker, args=(d, i, i*2)) 
      for i in range(10) 
      ] 
    for j in jobs: 
     j.start() 
    for j in jobs: 
     j.join() 
    print 'Results:', d 
$ python multiprocessing_manager_dict.py 
Results: {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18} 
Namespaces 

In addition to dictionaries and lists, a Manager can create a shared Namespace. Any named value added to the Namespace is visible across all of the clients. 

import multiprocessing 

def producer(ns, event): 
    ns.value = 'This is the value' 
    event.set() 

def consumer(ns, event): 
    try: 
     value = ns.value 
    except Exception, err: 
     print 'Before event, consumer got:', str(err) 
    event.wait() 
    print 'After event, consumer got:', ns.value 

if __name__ == '__main__': 
    mgr = multiprocessing.Manager() 
    namespace = mgr.Namespace() 
    event = multiprocessing.Event() 
    p = multiprocessing.Process(target=producer, args=(namespace, event)) 
    c = multiprocessing.Process(target=consumer, args=(namespace, event)) 

    c.start() 
    p.start() 

    c.join() 
    p.join() 
$ python multiprocessing_namespaces.py 
Before event, consumer got: 'Namespace' object has no attribute 'value' 
After event, consumer got: This is the value 
Questions connexes