Python uwsgi将请求映射到进程
在我的python应用程序中,我有一个基于许多sqlalchemy对象的大对象(游戏场) 对于每个简单的请求(例如:移动玩家),我必须创建这个对象,这是资源密集型的。我可以在全局变量中缓存一个就绪对象 但这只有在使用单个uwsgi线程时才有效Python uwsgi将请求映射到进程,python,nginx,uwsgi,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 = {}
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中,我可以使用散列$arg\u字段\u id代码>
但是,我需要用不同的套接字创建许多uwsgi进程。我觉得这是个坏主意
uwsgi能实现这个逻辑吗?
或
也许有人知道如何在进程之间共享对象吗?uWSGI缓存可以任意大,只需按照此处所述进行调整即可:
顺便说一句,您的方法通常不适用于多个进程,因为根据定义,一个进程不会与其他进程共享地址空间。您可以使用线程(在创建区域时适当锁定),但实际上,uwsgi缓存更容易(由进程自动共享),并且具有一些对您有用的属性:
(潜在竞争条件案例)
线程1:uwsgi.cache\u集('foo',大数据)
线程2:uwsgi.cache\u集('foo',大数据)
线程3:uwsgi.cache\u集('foo',大数据)
只有第一个获得自动缓存锁的选项将创建新对象,其他两个选项将是不可操作的谢谢!我当时不小心,就看了这篇文档。晚上我会试试这个。当我认为uwsgi.cache不能缓存我的对象时,我是对的。为什么?你可以储存任何水滴。显然,如果您想存储一个复杂的python对象,您必须像使用任何其他缓存服务器一样对其进行pickle/marshall/serialize如果我序列化了这个对象,我将失去与数据库的连接,然后从缓存中加载这个对象,更改一些值,然后尝试session.commit(),我会遇到异常。但我的问题是将mysql改为mongodb,并在应用程序逻辑上做了一些更改。现在,从mongodb快速获取对象,无需许多连接和选择。