什么';用Python存储快速变化的数据的最佳方法是什么?

什么';用Python存储快速变化的数据的最佳方法是什么?,python,variables,Python,Variables,为了学习Python和Socket,我正在编写一个2d游戏服务器 尽管我在任何时候都不会在这台服务器上看到超过几个人,但我希望尽我所能高效地编写它 我有一个名为“globuser”的全局字典,其中有另一个包含用户统计信息的字典(如X&Y坐标) 这是储存它们的最好方法吗?一本字典能有多大? 我想你也可以尝试使用一个常规的数据库,但那会非常慢。 或者我应该使用完全不同的方案 多个线程是否可以同时访问同一个变量,或者它们是否处于挂起状态? 我想当很多用户在线时,每一步都需要更新。如果它们能同时发生,那

为了学习Python和Socket,我正在编写一个2d游戏服务器

尽管我在任何时候都不会在这台服务器上看到超过几个人,但我希望尽我所能高效地编写它

我有一个名为“globuser”的全局字典,其中有另一个包含用户统计信息的字典(如X&Y坐标)

这是储存它们的最好方法吗?一本字典能有多大?
我想你也可以尝试使用一个常规的数据库,但那会非常慢。 或者我应该使用完全不同的方案

多个线程是否可以同时访问同一个变量,或者它们是否处于挂起状态?

我想当很多用户在线时,每一步都需要更新。如果它们能同时发生,那太好了!但是,如果他们每个人都需要“锁定”变量,那就没那么好了。

我可以考虑的一件事是将用户存储为
Player
对象的列表。查看
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因为这样可以在创建

我也不会太担心在这个阶段的表现。首先编写代码,然后通过探查器运行代码,找出最慢的地方——以优化的名义盲目更改是不好的


关于线程安全和数据共享,我发现,这似乎提供了一些关于这个主题的信息。

我可能会看到的一件事是将用户存储为
播放器
对象的列表。查看
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因为这样可以在创建

我也不会太担心在这个阶段的表现。首先编写代码,然后通过探查器运行代码,找出最慢的地方——以优化的名义盲目更改是不好的


关于线程安全和数据共享,我发现,这似乎提供了一些关于这个主题的信息。

使用多处理而不是线程。Its有很多优点,其中一个优点是可以为所有进程处理全局存储。此模块使用由manager启动的全局字典

下面是一个取自


使用多处理而不是线程。Its有很多优点,其中一个优点是可以为所有进程处理全局存储。此模块使用由manager启动的全局字典

下面是一个取自

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