Каков наилучший способ хранения быстро меняющихся данных в Python? - PullRequest
1 голос
/ 08 июля 2010

Чтобы узнать немного о Python и сокетах, я пишу небольшой сервер для двухмерных игр.

И хотя я не вижу на этом сервере больше нескольких человек в любой момент времениЯ хочу написать это так же эффективно, как I .

У меня есть глобальный словарь под названием "globuser", в нем есть еще один словарь, содержащий статистику пользователя (например, координаты X & Y)

Это лучший способ их хранить?Насколько большим может быть словарь?
Я думаю, вы могли бы также попытаться использовать обычную базу данных, но это было бы безумно медленно.Или я должен использовать совершенно другую схему?

Могут ли несколько потоков обращаться к одной и той же переменной одновременно или они приостановлены?
Я думаю, когда много пользователей находятся в сети, каждый ходпотребует обновления.Если они могут произойти одновременно, отлично!Но если каждый из них потребует «заблокировать» переменную, это будет не так здорово.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Одна вещь, на которую я мог бы обратить внимание, - это сохранение пользователей в виде списка Player объектов. Посмотрите на __slots__, так как это сэкономит вам память при создании многих экземпляров.

Я бы тоже не особо беспокоился о производительности на этом этапе. Сначала напишите код, а затем запустите его через профилировщик, чтобы выяснить, , где , он самый медленный - делать слепые изменения в имени оптимизации - плохо.

Что касается безопасности потоков и обмена данными, я обнаружил это , которое, кажется, дает некоторую информацию по этому вопросу.

2 голосов
/ 08 июля 2010

Используйте многопроцессорную обработку вместо многопоточность . Он имеет много преимуществ, и одно из преимуществ заключается в обработке глобального хранилища для всего процесса. Этот модуль использует глобальный словарь, который инициируется менеджером.

Вот пример, взятый из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...