我的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可以实现这个逻辑吗? 或
也许有人知道如何在进程之间共享对象?
答案 0 :(得分:1)
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)
只有第一个获取自动缓存锁定才会创建新对象,其他两个选项将是无操作