uwsgi将请求映射到进程

时间:2014-07-07 07:02:53

标签: python nginx uwsgi

我的python应用程序中有很多sqlalchemy对象的大对象(游戏场)。

对于每个简单的请求(例如:移动玩家),我必须创建此对象,这是资源密集型的。我可以在全局变量中缓存一个就绪对象。

但这只有在我使用单个uwsgi线程时才有效。

cache = {}

def applicatio(field_id):
    global cache
    if field_id not in cache.keys():
        field = get_field(field_id)
        cache[field_id] = field
    field.move_player()

我无法使用uwsgi.cache,因为我的对象大于64KB。而且我不确定它是否适用于基于数据库连接的对象。

还存在另一个问题 - 如果两个请求同时到达不同的进程,我可能会发生冲突。

因此我想将请求映射到相同的线程。在nginx中,我可以使用hash $arg_field_id;

但是我需要使用不同的套接字创建许多uwsgi进程。恕我直言,这是一个坏主意。

uwsgi可以实现这个逻辑吗? 或

也许有人知道如何在进程之间共享对象?

1 个答案:

答案 0 :(得分:1)

uWSGI缓存可以根据需要调整大小,只需按照此处的说明进行调整:

http://uwsgi-docs.readthedocs.org/en/latest/Caching.html#cache2-options

顺便说一下,通常你的方法不适用于多个进程,因为进程副定义不与其他进程共享地址空间。您可以使用线程(在创建区域时使用适当的锁定),但实际上,uwsgi缓存更容易(并且由进程自动共享),并且有一些对您有用的属性:

(潜在的竞争条件案例)

thread1:uwsgi.cache_set(' foo',big_data)

thread2:uwsgi.cache_set(' foo',big_data)

thread3:uwsgi.cache_set(' foo',big_data)

只有第一个获取自动缓存锁定才会创建新对象,其他两个选项将是无操作